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 子类之间看似不一致的行为的主要内容,如果未能解决你的问题,请参考以下文章

如何在类之间传输 NSManagedObject 子类?

子类化一个 NSManagedObject 子类

NSLog'd 时子类化的 NSManagedObject 不调用描述

为啥会有一个子类 NSManagedObject?

iOS - 核心数据 - 在 NSManagedObject 子类中使用删除方法后保存不成功

在 Xcode 6 中从核心数据数据模型创建 NSManagedObject 子类