我习惯使用doesRespondToSelector:
和instancesRespondToSelector:
在运行时确定对象是否有某些可用的方法。但是,在使用Core Data时,我没有看到@dynamic
属性的预期行为。例如,如果我的类上有sortOrder
属性,我可以使用Objective-C运行时在运行时看到此属性存在。但是,如果我询问相关Class
对象是否instancesRespondToSelector:
,我会回来NO
。如果我使用运行时枚举可用的方法,我的动态getter / setter都不会出现在列表中,这是一致的,但不是我期望的。
我的问题是:不使用运行时检查,是否有一种简单的方法可以确定NSManagedObject
子类的实例是否响应与其@dynamic
属性对应的getter / setter选择器?
答案 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];
}