2011-12-11 22 views
4

Objective-Cは実行時リフレクション機能を提供します。私は、宣言されたプロパティのgetter/setterセレクター名を見つけることを試みています。私はfield/setField:のような基本ルールを知っています。とにかく私は、実行時のリフレクションは完全な抽象化のために名前を解決する機能を提供するはずだと思いますが、その機能を見つけることができませんでした。Objective-Cでランタイムリフレクションを使用してプロパティゲッター/セッターメソッドセレクターを解決するには? (またはその逆)

私はゲッター/セッターメソッドにObjective-Cのランタイムでの反射(実際には、Appleのココア)

またはクエリを逆にして宣言されたプロパティのセレクタ(実装ではなく)を解決するにはどうすればよいです。 (メソッドセレクタ→宣言されたプロパティ)

答えて

8

は、私はあなたがプロパティを明示的に宣言されている場合にのみ、セレクタ名を取得することができると思います(XXXセッター=および/またはゲッター= XXX)だから、

ゲッターとセッターセレクタを取得しますクラスの猫のいくつかのプロパティ「furType」の名前:

objc_property_t prop = class_getProperty([Cat class], "furType"); 

char *setterName = property_copyAttributeValue(prop, "S"); 
if (setterName == NULL) { /*Assume standard setter*/ } 

char *getterName = property_copyAttributeValue(prop, "G"); 
if (getterName == NULL) { /*Assume standard getter */ } 

私はすべてのプロパティを反復処理し、マッチを探し以外に、逆クエリを知りません。希望が役立ちます。

+1

これらのメソッドは、 ''で宣言されています。 –

0

NSObjectカテゴリから少し更新しました。

+(SEL)getterForPropertyWithName:(NSString*)name { 
    const char* propertyName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    objc_property_t prop = class_getProperty(self, propertyName); 

    const char *selectorName = property_copyAttributeValue(prop, "G"); 
    if (selectorName == NULL) { 
     selectorName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    } 
    NSString* selectorString = [NSString stringWithCString:selectorName encoding:NSASCIIStringEncoding]; 
    return NSSelectorFromString(selectorString); 
} 

+(SEL)setterForPropertyWithName:(NSString*)name { 
    const char* propertyName = [name cStringUsingEncoding:NSASCIIStringEncoding]; 
    objc_property_t prop = class_getProperty(self, propertyName); 

    char *selectorName = property_copyAttributeValue(prop, "S"); 
    NSString* selectorString; 
    if (selectorName == NULL) { 
     char firstChar = (char)toupper(propertyName[0]); 
     NSString* capitalLetter = [NSString stringWithFormat:@"%c", firstChar]; 
     NSString* reminder  = [NSString stringWithCString: propertyName+1 
                encoding: NSASCIIStringEncoding]; 
     selectorString = [@[@"set", capitalLetter, reminder, @":"] componentsJoinedByString:@""]; 
    } else { 
     selectorString = [NSString stringWithCString:selectorName encoding:NSASCIIStringEncoding]; 
    } 

    return NSSelectorFromString(selectorString); 
}