2012-01-25 48 views
4

我目前面临的问题是检查对象(NSManagedObject)的属性是否存在。Objective C - 用于动态属性的respondsToSelector

不幸的是,方法

[[MyObject class] respondsToSelector:@selector(myProperty)]; 

总是返回NO。

我想这是因为由CoreData产生的财产是一种新的样式属性ALA

@property (nonatomic, strong) NSString *myProperty 

因此,任何想法如何解决这个问题呢?

我真的很感激你的所有建议;)

在此先感谢! Alex

回答

14

[[MyObject class] respondsToSelector:...]询问元对象是否响应该选择器。所以,实际上,它询问是否有该选择器的类方法。您的代码将返回YES,如果你有:

- (NSString *)myProperty; 

你需要调用respondsToSelector:你的类的实例:

+ (NSString *)myProperty; 

,因为你有实例方法是等效的,则返回NO。

您通常可以直接在元类上使用instancesRespondToSelector:(so,[MyObject instancesRespondToSelector:...]),但核心数据仅在创建对象时合成相关的方法实现,因此这是非启动器。但是,您可以通过正常的NSEntityDescription路线创建实例,并在此基础上测试respondsToSelector:

因为它的所有核心数据,另一种是通过其entitiesByName词典问NSManagedObjectModel为相关NSEntityDescription和检查实体描述的propertiesByName字典。

+1

更好的回答...我会删除我的! – jrturton

+0

好的,但问题是,我没有一个实例对象,我想测试这个......所以还有其他的可能吗? – Alexander

+1

您通常会直接在'MyObject'上使用'instancesRespondToSelector:',但在这种情况下,Core Data的内部使其成为非启动器。因此,您需要让Core Data为您提供一个实例,然后执行一个普通的'respondsToSelector:',然后丢弃该对象,而不是将其添加到持久性存储中。 – Tommy

0

您是否正在合成类文件中的属性?

@interface SomeClass : NSObject 
{ 
    @property (nonatomic, strong) NSString *myProperty 
} 
@end 


@implementation SomeClass 

    @synthesize myProperty; 

@end 
+0

我使用CoreData的生成文件,所以道具是@动态的,汤米可以给我答案;) – Alexander

1

我需要这个的唯一情况是动态设置东西,所以我只寻找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属性来寻找它们对应的键将会是很大的浪费。