2010-09-21 49 views
8

我注意到了Core Data指南,并且有两种方法可以获得新的NSManagedObject实例。关于获取新的NSManagedObject对象

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

是否有这两种方法之间有什么区别?或者,它们只是意味着在任何条件下获得新的NSManagedObject都是一样的。

回答

7

根据文档上的说法,通过使用NSEntityDescription的类方法实例化NSManagedObject,可以在不声明/导入其头的情况下实现NSManagedObject。通过设置类的名称,您将获得对象的“完全配置的实例”。

当事情不断变化时,它对于开发的早期阶段非常有用,但它可能是一个风险因素,因为如果拼错了班级的名称,因为没有编译错误或警告,因为它是一个字符串。

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

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

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

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

这是文档

NSEntityDescription Class ReferenceinsertNewObjectForEntityForName:inManagedObjectContext:

返回值

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

讨论

这种方法很容易让你无需担心被管理对象创建的细节打造一个给定的实体的实例。

该方法在Mac OS X v10.4中特别有用,因为您可以使用它创建新的托管对象,而无需知道用于表示实体的类。这在开发生命周期的早期特别有利,因为类和类名称是不稳定的。

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

NSManagedObject Class ReferenceinitWithEntity:insertIntoManagedObjectContext:

返回值

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

讨论

NSManagedObject使用动态类生成由自动创建适合entity.initWithEntity的类的子类,以支持目标C 2个属性功能(见“属性声明”):insertIntoManagedObjectContext:因此返回适用于实体的类的实例。动态生成的子类将基于实体指定的类,因此在模型中指定自定义类将取代传递给alloc的类。

如果上下文不为零,则此方法调用[上下文insertObject:self](这会导致调用awakeFromInsert)。

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

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

+0

非常感谢。 – AechoLiu 2010-09-21 13:40:54