关于获取一个新的 NSManagedObject 对象

Posted

技术标签:

【中文标题】关于获取一个新的 NSManagedObject 对象【英文标题】:About getting a new NSManagedObject object 【发布时间】:2010-09-21 03:42:58 【问题描述】:

我看Core Data的指南,有两种方法可以获取一个新的NSManagedObject实例。

- NSManagedObject 类的 initWithEntity:insertIntoManagedObjectContext: +insertnewObjectForEntityForName:inManagedObjectContext: 的 NSEntityDescription 类

这两种方法有什么区别吗?或者,它们只是在任何条件下获取新的 NSManagedObject 的意思相同。

【问题讨论】:

【参考方案1】:

根据文档中的内容,通过使用NSEntityDescription 中的类方法来实例化 NSManagedObject ,可以在不声明/导入其标头的情况下执行此操作。通过设置类的名称,您将获得对象的“完全配置的实例”。

当事情不断变化时,它在开发的早期阶段很有用,但它可能是一个风险因素,因为如果您拼错类的名称,您不会收到任何编译错误或警告,因为它是一个字符串。

NSManagedObject 中的方法需要将特定类的接口导入到您的文件中,并使其对错误更加健壮,因为编译器可以检查该类是否存在。

例如,它们将具有相同的结果,它们将返回指定类的实例。虽然保留计数会有所不同:

- initWithEntity:insertIntoManagedObjectContext:(保留计数 == +1)

+ insertnewObjectForEntityForName:inManagedObjectContext:(保留计数 == 0)

这是文档

NSEntityDescription Class Reference (insertNewObjectForEntityForName:inManagedObjectContext:)

返回值

一个新的、自动发布的、完全配置的实体类的实例,用于名为 entityName 的实体。该实例具有其实体描述集并将其插入到上下文中。

讨论

此方法使您可以轻松创建给定实体的实例,而无需担心托管对象创建的细节。

该方法在 Mac OS X v10.4 上特别有用,因为您可以使用它来创建新的托管对象,而无需知道用于表示实体的类。当类和类名易变时,这在开发生命周期的早期尤其有用。

在 Mac OS X v10.5 及更高版本以及 ios 上,您可以改为使用 initWithEntity:insertIntoManagedObjectContext: 来返回实体的相应类的实例。

NSManagedObject Class Reference (initWithEntity:insertIntoManagedObjectContext:)

返回值

实体的适当类的初始化实例。

讨论

NSManagedObject 使用动态类生成来支持 Objective-C 2 属性特性(请参阅“声明的属性”),通过自动创建适合于 entity.initWithEntity:insertIntoManagedObjectContext 的类的子类:因此为实体返回适当类的实例.动态生成的子类将基于实体指定的类,因此在模型中指定自定义类将取代传递给 alloc 的类。

如果 context 不是 nil,则此方法调用 [context insertObject:self](这会导致调用 awakeFromInsert)。

不鼓励您重写此方法,而应重写 awakeFromInsert 和/或 awakeFromFetch(如果这些方法有共同的逻辑,则应将其分解为从两者调用的第三个方法)。如果您在此方法中执行自定义初始化,可能会导致撤消和重做操作出现问题。

在许多应用程序中,不需要随后将新创建的托管对象分配给特定的存储 — 请参阅 assignObject:toPersistentStore:。如果您的应用程序有多个存储,并且您确实需要将对象分配给特定存储,则不应在托管对象的初始化方法中这样做。这样的分配是控制器而不是模型级逻辑。

【讨论】:

以上是关于关于获取一个新的 NSManagedObject 对象的主要内容,如果未能解决你的问题,请参考以下文章

新的 NSManagedObject 子类与新的 NSObject 子类?

如何在单个托管对象上下文中初始化新的 NSManagedObject 并设置与另一个 NSManagedObject 的关系?

将现有的 NSManagedObject (s) 导入新的 .xcdatamodeld

您如何获得一个新的核心数据实体属性以反映在该实体的 NSManagedObject 中?

RestKit 0.20——创建新的 NSManagedObject 的首选方法是啥?

创建NSManagedObject子类...在我的项目中创建一个新的错误