Objective-Cでクラスで定義された情報を調べる方法はintrospectionと呼ばれます。これはJavaやDOT.NETではreflectionと呼ばれるものに相当します。
- (BOOL)isMemberOfClass:(Class)aClass
- (BOOL)isKindOfClass:(Class)aClass
- (BOOL)respondsToSelector:(SEL)aSelector
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
- (Class)class
インスタンスのクラスオブジェクトを取得する。
+ (Class)class
(char *)object_getClassName(anObj)
クラスのクラス継承関係をチェックする
+ (BOOL)isSubclassOfClass:(Class)aClass+ (BOOL)instancesRespondToSelector:(SEL)aSelector
NSClassFromString(NSString *aClassName)
クラス名からクラスを取得する。
(NSString *)NSStringFromClass([anObject class]);
インスタンスのクラスオブジェクトからクラス名を取得する。
次の方法でも同じ結果が得られる。
(NSString *)[anObject class].description;
C文字列のクラス名からクラスオブジェクトを取得する。
(SEL)NSSelectorFromString(NSString *aSelectorName)
メソッド名からセレクタを取得する。(NSString *)NSStringFromSelector(SEL aSelector)
セレクタからメソッド名を取得する。
Objective-Cではインスタンス変数は隠蔽しメソッドを介してアクセスするので、インスタンス変数を取得する関するメソッドや関数はありません。
@propertyは実体はアクセサメソッドなので、セレクタとして取得することが可能で、次のようなプロパティーに関する関数があります。
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
const char *property_getName(objc_property_t property)
objc_property_t class_getProperty(Class cls, const char *name)
objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)
const char *property_getAttributes(objc_property_t property)
プロパティーの場合は、valueForKeyを用いて値を取得することができます。
id val = [aObj valueForKey:@"propName"];
intなどのプリミティブな数値型の場合はNSNumberオブジェクトが返されます。
参照:
Objective-Cプログラミング言語(The Objective-C Programming Language)
Objective-C Runtime Programming Guide
0 件のコメント:
コメントを投稿