为什么Core Data托管对象的+ initialize方法被调用两次?

Dav*_*ren 4 core-data objective-c

我有一个带有+initialize方法的托管核心数据对象.(如果重要的话,我希望使用该方法初始化一个设置成本昂贵的静态变量.)在测试初始化​​代码时,我惊讶地发现该+initialize方法被调用了两次.

initialize被调用的第一次被self定义为(Class) MyClass,正如我所期望的那样.

第二次initialize被调用self被定义为(Class) MyClass_MyClass_,这使我怀疑Core Data托管对象的某种异常初始化.

虽然这对我来说不会造成问题(我可以测试一下静态变量是否已经初始化,无论如何我都会做,处理ubclassing),但这让我怀疑Core Data是在对象中做了什么或类生命周期,我不明白.有人可以向我解释这个MyClass_MyClass_ +initialize方法调用中发生了什么吗?

Mar*_*n R 5

Core Data属性的访问器方法是在运行时动态创建的.这通过创建子类MyClass_MyClass_(of MyClass)并将必要的方法添加到子类来实现.

Core Data也做了一些技巧来隐藏你的实体的对象实际上是子类的实例的事实:

e = [NSEntityDescription insertNewObjectForEntityForName:@"MyClass" inManagedObjectContext:context];
NSLog(@"%@", [e class]);               // --> MyClass
NSLog(@"%s", object_getClassName(e));  // --> MyClass_MyClass_
Run Code Online (Sandbox Code Playgroud)

如果您没有为实体设置自定义类,可能会更加明显.在那种情况下,输出是

NSLog(@"%@", [e class]);               // --> NSManagedObject
NSLog(@"%s", object_getClassName(e));  // --> NSManagedObject_MyClass_
Run Code Online (Sandbox Code Playgroud)

所以e"看起来像"一个实例NSManagedObject,但实际上是一个动态创建的子类的实例NSManagedObject_<EntityName>_.此子类实现所有访问器方法(对于此实体是唯一的).