2011-12-11 30 views
4

Objective-C提供運行時反射功能。我試圖找到聲明屬性的getter/setter選擇器名稱。我知道像field/setField:這樣的基本規則。無論如何,我認爲運行時反射應該提供一個功能來解析完整抽象的名稱,但我找不到該函數。如何解決在Objective-C中使用運行時反射的屬性getter/setter方法選擇器? (或反向)

我怎樣才能解決的getter/setter方法聲明的屬性的選擇(未執行),在Objective-C的運行時反射(實際上是蘋果的可可)

或反向查詢。 (方法選擇→聲明的屬性)

回答

8

我認爲你可以選擇名稱僅如果財產申報有明確的(二傳手= XXX和/或吸氣= XXX)

因此,要獲得getter和setter選擇爲類「貓」的某些屬性'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); 
}