【问题标题】:How to make NSManagedObject NSString properties be with "copy" instead of "retain"?如何使 NSManagedObject NSString 属性使用“复制”而不是“保留”?
【发布时间】:2012-07-09 20:11:50
【问题描述】:

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

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

【问题讨论】:

  • 以防万一您不知道这一点 - 普通(非可变)NSStringcopy 方法返回相同的实例,所以不要惊慌您的复制属性不会测试时实际上不会复制任何内容。
  • 是的,我知道,已经测试过了。 “复制”仅复制可变类型对象。另外,值得注意的是,“copy”属性也会向 NSArray 元素发送复制消息,因此如果数组中存在可变字符串,则将被复制。
  • 请看我在答案下方的评论。今天,试图弄清楚“复制”属性的实际用法。我了解它们是如何工作的,只是从来不需要使用 NSMutableString,所以根据我的经验复制是多余的,只是为了将来的保护。

标签: iphone objective-c core-data


【解决方案1】:

这样做的唯一方法是更改​​ NSManagedObject 子类中的属性声明。值得庆幸的是,Core Data 会自动处理其余部分。

【讨论】:

  • 在开发过程中,很可能某些实体会在核心数据模型架构中发生变化,因此重新生成 NSManagedObjects 会将已编辑的属性覆盖为“保留”。所以,这有点不便。
  • 另外,想分享一下我对“复制”属性的看法。这些属性防止从外部更改 NSMutableString 属性的值。没有可变的 NSNumber 和 NSDate,所以“复制”只影响字符串。但是,根据我在 iOS 应用程序开发的第二年,我从来不需要使用 NSMutableString,因此“复制”的情况非常罕见,恕我直言 :) Apple 鼓励在他们的示例中对 NSString 属性使用复制,但在数组,字典和集合,尽管存在相同的覆盖情况(请参阅我在问题下方的第一条评论)。有点缺乏一条规则......
  • @centurion 试试 mogenerator。它将您的代码分成生成的类和它的子类;您可以在不覆盖更改的情况下编辑子类。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2015-06-01
  • 2014-10-08
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多