目标C-响应ToSelector的动态特性



我目前面临的问题是检查对象(NSManagedObject)的属性是否存在。

不幸的是方法

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

总是返回NO。

我认为这是因为CoreData生成的属性是一个新的风格属性ala

@property (nonatomic, strong) NSString *myProperty

那么有什么想法可以解决这个问题吗?

我非常感谢你的所有建议;)

提前感谢!Alex

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

+ (NSString *)myProperty;

它返回NO,因为您有实例方法的等价物:

- (NSString *)myProperty;

您需要在类的实例上调用respondsToSelector:

您通常可以直接在元类上使用instancesRespondToSelector:(因此,[MyObject instancesRespondToSelector:...]),但核心数据只有在创建对象时才会合成相关的方法实现,因此这是不可能的。但是,您可以通过普通的NSEntityDescription路由创建一个实例,并在此基础上测试respondsToSelector:

由于它都是核心数据,一种替代方案是通过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

最新更新