当我创建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将在运行时创建两个名为name
和setName:
的方法。所以我使用这样的代码来验证我的想法。
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++;
}
}
我很遗憾没有记录任何方法名称,如name
或setName:
。但我使用此代码object.name = @"1";
并没有任何问题。
答案 0 :(得分:1)
当他们说'动态&#34;它们确实意味着它 - 动态实现似乎只在调用选择器时(直接或通过valueForKey:
)提供。如果您覆盖resolveInstanceMethod:
课程中的Employee
,则可以看到这种情况。调用超级实现并记录选择器名称和返回值。据推测,此方法将由class_copyMethodList
列出,但我从未检查过。