如何确定NSManagedObject的子类是否在运行时具有特定属性

时间:2011-02-08 18:00:59

标签: objective-c properties selector

我习惯使用doesRespondToSelector:instancesRespondToSelector:在运行时确定对象是否有某些可用的方法。但是,在使用Core Data时,我没有看到@dynamic属性的预期行为。例如,如果我的类上有sortOrder属性,我可以使用Objective-C运行时在运行时看到此属性存在。但是,如果我询问相关Class对象是否instancesRespondToSelector:,我会回来NO。如果我使用运行时枚举可用的方法,我的动态getter / setter都不会出现在列表中,这是一致的,但不是我期望的。

我的问题是:不使用运行时检查,是否有一种简单的方法可以确定NSManagedObject子类的实例是否响应与其@dynamic属性对应的getter / setter选择器?

2 个答案:

答案 0 :(得分:12)

您可以通过NSEntityDescription检查NSManagmentObject:

- (BOOL)hasPropertyWithName:(NSString *)name
{
    NSEntityDescription *desc = self.entity;
    return [desc.attributesByName objectForKey:name] != nil;
}

答案 1 :(得分:4)

我在NSManagedObject个对象上使用了以下方法来检索它的属性列表。也许它会指出你正确的方向....

- (NSMutableArray *) propertyNames: (Class) class { 
    NSMutableArray *propertyNames = [[NSMutableArray alloc] init];
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList(class, &propertyCount);

    for (unsigned int i = 0; i < propertyCount; ++i) {
        objc_property_t property = properties[i];
        const char * name = property_getName(property);
        [propertyNames addObject:[NSString stringWithUTF8String:name]];
    }
    free(properties);
    return [propertyNames autorelease];
}