2010-09-21 48 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