4

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

不幸的是方法

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

总是返回 NO。

我认为这是因为 CoreData 生成的属性是一种新的样式属性 ala

@property (nonatomic, strong) NSString *myProperty

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

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

提前致谢!亚历克斯

4

3 回答 3

15

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

+ (NSString *)myProperty;

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

- (NSString *)myProperty;

你需要调用respondsToSelector:你的类的一个实例。

您通常可以instancesRespondToSelector:直接在元类 (so, [MyObject instancesRespondToSelector:...]) 上使用,但 Core Data 仅在您创建对象时综合相关方法实现,因此这不是入门。但是,您可以通过正常NSEntityDescription路线创建一个实例并对其进行测试respondsToSelector:

由于它都是核心数据,另一种方法是通过其字典询问NSManagedObjectModel相关信息并检查实体描述的字典。NSEntityDescriptionentitiesByNamepropertiesByName

于 2012-01-25T13:50:25.530 回答
1

我唯一需要的情况是动态设置,所以我只是在寻找设置器。我只是为 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 属性单步查找它们对应的键只会浪费很多精力。

于 2015-07-19T04:18:59.510 回答
0

你是在类文件中综合属性吗?

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


@implementation SomeClass

    @synthesize myProperty;

@end
于 2012-01-25T13:45:48.137 回答