Objective C – respondsToSelector用于动态属性
我目前正面临检查对象(NSManagedObject)的属性是否存在的问题。
不幸的是方法
[[MyObject class] respondsToSelector:@selector(myProperty)];
总是返回NO。
我认为这是因为CoreData生成的属性是一个新的样式属性ala
@property (nonatomic, strong) NSString *myProperty
那么任何想法如何解决这个问题?
我非常感谢你的所有建议;)
提前致谢! 亚历克斯
[[MyObject class] respondsToSelector:...]
询问元对象是否响应该选择器。 因此,实际上,它会询问是否存在具有该选择器的类方法。 如果您有以下代码,您的代码将返回YES:
+ (NSString *)myProperty;
它返回NO,因为您具有等效的实例方法:
- (NSString *)myProperty;
您需要在类的实例上调用respondsToSelector:
.
您通常可以直接在元类上使用instancesRespondToSelector:
因此, [MyObject instancesRespondToSelector:...]
)但Core Data仅在您创建对象时合成相关的方法实现,因此这是一个非启动器。 但是,您可以通过正常的NSEntityDescription
路由创建实例并测试respondsToSelector:
on。
由于它是所有核心数据,因此可以通过其entitiesByName
字典向NSManagedObjectModel
询问相关的NSEntityDescription
,并检查实体描述的propertiesByName
字典。
我需要的唯一情况是动态设置,所以我只是在寻找setter。 我只是编写setter的签名,然后测试它是否存在然后使用它。
NSArray * keys = [myObject allKeys]; for(NSString * key in keys) { NSString * string = [NSString stringWithFormat:@"set%@:", [key capitalizedString]]; SEL selector = NSSelectorFromString(string); if([myObject respondsToSelector:selector] == YES) { id object = [dict objectForKey:key]; // To massage the compiler's warnings avoid performSelector IMP imp = [card methodForSelector:selector]; void (*method)(id, SEL, id) = (void *)imp; method(myObject, selector, object); } }
此代码满足您可能无法消化字典中收到的所有数据的需要。 在这种情况下,它是稀疏的json,因此一些数据可能并不总是存在于json中,因此通过myObjects属性寻找相应的键只会浪费很多精力。
你在类文件中合成属性吗?
@interface SomeClass : NSObject { @property (nonatomic, strong) NSString *myProperty } @end @implementation SomeClass @synthesize myProperty; @end