Objective-C 提供运行时反射特性。我正在尝试查找已声明属性的 getter/setter 选择器名称。我知道field
/之类的基本规则setField:
。无论如何,我认为运行时反射应该提供一个功能来解析完整抽象的名称,但我找不到该功能。
如何在Objective-C(实际上是Apple的Cocoa)中使用运行时反射解决声明属性的getter/setter方法选择器(不是实现)
或反向查询。(方法选择器→声明的属性)
Objective-C 提供运行时反射特性。我正在尝试查找已声明属性的 getter/setter 选择器名称。我知道field
/之类的基本规则setField:
。无论如何,我认为运行时反射应该提供一个功能来解析完整抽象的名称,但我找不到该功能。
如何在Objective-C(实际上是Apple的Cocoa)中使用运行时反射解决声明属性的getter/setter方法选择器(不是实现)
或反向查询。(方法选择器→声明的属性)
我认为只有使用显式声明属性(setter = XXX 和/或 getter = XXX)才能获取选择器名称
因此,要获取类“Cat”的某些属性“furType”的 getter 和 setter 选择器名称:
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 */ }
除了遍历所有属性并查找匹配项之外,我不知道反向查询。希望有帮助。
我的 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);
}