NSManagedObject 子类之间看似不一致的行为
Posted
技术标签:
【中文标题】NSManagedObject 子类之间看似不一致的行为【英文标题】:Seemingly inconsistent behavior among NSManagedObject subclasses 【发布时间】:2010-10-14 18:27:25 【问题描述】:我有几个 NSManagedObject 的子类。它们都是用类似这样的代码实例化的:
MeasurementDescriptor *descriptor = (MeasurementDescriptor *)[NSEntityDescription
insertNewObjectForEntityForName:@"MeasurementDescriptor"
inManagedObjectContext:context];
或者像这样:
Experiment *experiment = (Experiment *)[NSEntityDescription
insertNewObjectForEntityForName:@"Experiment"
inManagedObjectContext:context];
不过,奇怪的是(来自上面的代码)
NSLog(@" descriptor's class = %@", NSStringFromClass([descriptor class]));
打印出'NSManagedObject',而
NSLog(@" experiment's class = %@", NSStringFromClass([experiment class]));
打印出“实验”。
有人知道为什么会这样吗?与我的其他 NSManagedObject 子类不同,MeasurementDescriptor 没有 ivars(不包括其核心数据属性)。添加 ivar 并没有改变任何东西。同样,MeasurementDescriptor 是唯一没有“关系”属性的 NSManagedObject 子类。也许这是造成这种奇怪的原因...???
【问题讨论】:
【参考方案1】:唯一的解释是您的MeasurementDescriptor
子类实际上并不为代码所知。最常见的原因是:
-
在数据模型编辑器中,没有将实体的
Class
属性设置为正确的类。
未将子类的源文件添加到目标。
Core Data 很容易做到这一点,因为如果它找不到专用的子类,它不会抱怨,只会返回一个用实体的属性键名初始化的通用 NSManagedObject。
【讨论】:
我同意您的解释,但您列出的两种情况都不适用于我的示例。 MeasurementDescriptor 的实体类是MeasurementDescriptor,源文件包含在项目中。事实上,这就是 NSLog 行提醒我这个问题的地方。可能是在从模型 A(其中没有 MeasurementDescriptor)迁移到模型 B(其中引入了 MeasurementDescriptor)期间,仅存在于一个模型中的实体被视为 NSManagedObjects。虽然我不确定为什么会这样。以上是关于NSManagedObject 子类之间看似不一致的行为的主要内容,如果未能解决你的问题,请参考以下文章
NSLog'd 时子类化的 NSManagedObject 不调用描述