2012年3月11日日曜日

introspection(reflection)メソッド/関数


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)superclass
+ (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;

(id)objc_getClass(char *aClassName)
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 件のコメント: