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