为什么NSManagedObject子类不能使用class_copyMethodList查找动态生成的方法?

时间:2016-02-23 08:27:23

标签: ios objective-c core-data

当我创建NSManagedObject子类Employee时,它根据name文件中的EntityDescription具有属性xcdatamodel。在.m文件中,代码使用@dynamic修改它,如下所示:

@interface Employee (CoreDataProperties)

@property (nullable, nonatomic, retain) NSString *name;

@end   


@implementation Employee (CoreDataProperties)

@dynamic name;

@end

根据Apple的文件:

  

Core Data为托管对象的相应托管对象模型的实体中定义的属性动态生成有效的公共和原始get和set属性访问器方法和关系访问器方法。因此,您通常不需要为建模属性编写自定义访问器方法。

据此,我认为CoreData Framework将在运行时创建两个名为namesetName:的方法。所以我使用这样的代码来验证我的想法。

Employee *object = [NSEntityDescription   insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.managedObjectContext];
object.name = @"1";
[[self class] showInstanceMethod:[Employee class]];

+ (void)showInstanceMethod:(Class)class {
unsigned int outCount;
//..show InstanceMethodList
Method *methodsList = class_copyMethodList(class, &outCount);
for (int i = 0; i < outCount; i ++) {
    SEL sel = method_getName(*methodsList);
    NSString *methodName = NSStringFromSelector(sel);
    NSLog(@"\nmethodName:%@\n", methodName);
    methodsList++;
}
}  

我很遗憾没有记录任何方法名称,如namesetName:。但我使用此代码object.name = @"1";并没有任何问题。

1 个答案:

答案 0 :(得分:1)

当他们说'动态&#34;它们确实意味着它 - 动态实现似乎只在调用选择器时(直接或通过valueForKey:)提供。如果您覆盖resolveInstanceMethod:课程中的Employee,则可以看到这种情况。调用超级实现并记录选择器名称和返回值。据推测,此方法将由class_copyMethodList列出,但我从未检查过。