关于获取新的NSManagedObject对象

时间:2010-09-21 03:42:59

标签: iphone cocoa core-data nsmanagedobject

我观看核心数据指南,有两种方法可以获得新的NSManagedObject实例。

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

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

1 个答案:

答案 0 :(得分:7)

根据文档中的内容,通过使用NSEntityDescription中的类方法实例化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使用动态类生成来支持Objective-C 2属性功能(请参阅“声明的属性”),方法是自动创建适合于entity.initWithEntity的类的子类:insertIntoManagedObjectContext:因此返回实体的相应类的实例。动态生成的子类将基于实体指定的类,因此在模型中指定自定义类将取代传递给alloc的类。

     

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

     

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

     

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