2012-07-10 87 views
5

默认情况下,从数据模型创建NSManagedObject子类文件时,Core Data会为字符串类型列创建NSString类型的属性(非原子,保留)。我可能会考虑性能,但是,我正在实现数据映射器模式,其中核心数据NSManagedObject子类与模型类分开。因此,在将模型类转换为Core数据NSManagedObject子类时,仅保留一个指针而不是副本。从架构的角度来看,它会在核心数据访问和模型类之间进行逻辑分离,所以我需要使用副本而不是保留。如何使NSManagedObject NSString属性与“复制”,而不是“保留”?

是否唯一的方法是手动更改NSManagedObject子类中的属性?

+0

为防万一你不知道这一点 - 正常(不可变)的'NSString'的'copy'方法返回相同的实例,所以不要吓着你的复制属性实际上不会复制任何东西当你测试它。 – Monolo 2012-07-10 11:30:48

+0

是的,我知道这一点,已经测试过。 “复制”仅复制可变类型对象。另外,值得注意的是,“copy”属性还将复制消息发送给NSArray元素,因此如果存在于数组内,则可复制的字符串将被复制。 – Centurion 2012-07-10 20:49:09

+0

请看看我的评论下面的答案。今天,试图找出实际使用“复制”属性。我明白他们是如何工作的,从来没有需要使用NSMutableString,所以根据我的经验复制是多余的,只是为了将来的保护。 – Centurion 2012-07-10 21:07:11

回答

4

要做到这一点的唯一方法是更改​​NSManagedObject子类中属性的声明。值得庆幸的是,Core Data会自动处理剩余的内容。

+0

在开发过程中,很可能有些实体会在核心数据模型模式中更改,因此重新生成NSManagedObjects会覆盖已编辑的属性以“保留”。所以,这有点不方便。 – Centurion 2012-07-10 20:56:25

+0

另外,想分享我对“复制”属性的看法。这些属性阻止从外部更改NSMutableString属性的值。没有可变的NSNumber和NSDate,所以“复制”只影响字符串。然而,根据我第二年的iOS应用开发,我从来没有需要使用NSMutableString,所以“复制”的情况是非常罕见的恕我直言:)苹果鼓励在他们的例子中使用NSString属性的副本,但使用“保留”上数组,字典和集合,尽管存在相同的覆盖情况(请参阅我在问题下面的第一条评论)。缺少一条规则...... – Centurion 2012-07-10 21:01:46

+1

@centurion尝试mogenerator。它将你的代码分离到生成的类和它的一个子类中;您可以编辑子类而不改变被覆盖。 – 2012-07-11 06:25:54