8

私は Core Data ガイドを見ていますが、新しい NSManagedObject インスタンスを取得するには 2 つの方法があります。

  • - initWithEntity:insertIntoManagedObjectContext: NSManagedObject クラスの
  • + insertnewObjectForEntityForName:inManagedObjectContext: NSEntityDescription クラスの

両方の方法に違いはありますか?または、どのような条件下でも新しい NSManagedObject を取得するために同じことを意味します。

4

1 に答える 1

7

ドキュメントに記載されている内容に基づいて、クラスメソッド fromNSEntityDescriptionを使用して NSManagedObject をインスタンス化することにより、ヘッダーを宣言/インポートせずにそれを行うことができます。クラスの名前を設定すると、オブジェクトの「完全に構成されたインスタンス」が返されます。

物事が絶えず変化している開発の初期段階では便利ですが、文字列であるため、クラスの名前のスペルを間違えてもコンパイルエラーや警告が表示されないため、リスク要因になる可能性があります.

からのメソッドNSManagedObjectは、特定のクラスのインターフェイスがファイルにインポートされる必要があり、コンパイラがそのクラスが存在するかどうかを確認できるため、エラーに対してより堅牢になります。

たとえば、同じ結果が得られ、指定されたクラスのインスタンスが返されます。保持数は異なりますが、次のようになります。

- initWithEntity:insertIntoManagedObjectContext:(保持カウント == +1)

+ insertnewObjectForEntityForName:inManagedObjectContext:(保持カウント == 0)

ここにドキュメントがあります

NSEntityDescription クラス リファレンス( insertNewObjectForEntityForName:inManagedObjectContext:)

戻り値

entityName という名前のエンティティのクラスの新しい、自動解放された、完全に構成されたインスタンス。インスタンスにはエンティティ記述セットがあり、コンテキストに挿入されます。

討論

この方法を使用すると、管理対象オブジェクトの作成の詳細を気にすることなく、特定のエンティティのインスタンスを簡単に作成できます。

このメソッドは、エンティティを表すために使用されるクラスを知らなくても、新しい管理対象オブジェクトを作成するために使用できるため、Mac OS X v10.4 で特に役立ちます。これは、クラスとクラス名が不安定な開発ライフサイクルの早い段階で特に有益です。

Mac OS X v10.5 以降および iOS では、エンティティの適切なクラスのインスタンスを返す initWithEntity:insertIntoManagedObjectContext: を代わりに使用できます。

NSManagedObject クラス リファレンス( initWithEntity:insertIntoManagedObjectContext:)

戻り値

エンティティの適切なクラスの初期化されたインスタンス。

討論

NSManagedObject は、動的クラス生成を使用して、entity.initWithEntity:insertIntoManagedObjectContext に適したクラスのサブクラスを自動的に作成することにより、Objective-C 2 プロパティ機能 (「宣言されたプロパティ」を参照) をサポートします。したがって、エンティティに適切なクラスのインスタンスを返します。動的に生成されたサブクラスは、エンティティによって指定されたクラスに基づいているため、モデルでカスタム クラスを指定すると、alloc に渡されたクラスが置き換えられます。

context が nil でない場合、このメソッドは [context insertObject:self] を呼び出します (これにより、awakeFromInsert が呼び出されます)。

このメソッドをオーバーライドすることはお勧めできません。代わりに、awakeFromInsert および/または awakeFromFetch をオーバーライドする必要があります (これらのメソッドに共通のロジックがある場合は、両方から呼び出される 3 番目のメソッドに組み込む必要があります)。このメソッドでカスタム初期化を実行すると、元に戻す操作とやり直し操作で問題が発生する可能性があります。

多くのアプリケーションでは、新しく作成された管理対象オブジェクトを後で特定のストアに割り当てる必要はありません。「assignObject:toPersistentStore:」を参照してください。アプリケーションに複数のストアがあり、オブジェクトを特定のストアに割り当てる必要がある場合は、マネージド オブジェクトの初期化メソッドでそれを行うべきではありません。このような割り当てはコントローラーであり、モデルレベルのロジックではありません。

于 2010-09-21T04:45:10.130 に答える