オブジェクトが削除されてコンテキストが保存された後、NSManagedObjectsへのポインタがどうなるか説明してもらえますか?自動的にnilに設定されるように設定するにはどうすればよいですか?
3 に答える
まあ、それは非常に簡単です。
[managedObjectContext deleteObject:managedObject];
[managedObjectContext save:error];
managedObject = nil;
多数のオブジェクトを削除するときにメモリリークが発生するのが心配な場合は、高速列挙を使用してください。これは、それ自体の背後でクリーンアップすることがほぼ保証されています。
for (NSManagedObject *obj in fetchedObjects) {
[managedObjectContext deleteObject:obj];
}
[managedObjectContext save:error];
オブジェクトを削除すると、isDeleted
プロパティはtrueになります。コンテキストを保存した後、管理対象オブジェクトへの参照がまだある場合はfalseisDeleted
になります。
管理対象オブジェクトを安全にweak
参照できます。weak
コアデータがARCで実行されると、参照はARCで自動的に無効になります。
CoreDataプログラミングガイドの関連する3つの段落は次のとおりです。
Core Dataは、管理対象オブジェクトのライフサイクルを「所有」しています。フォールトとアンドゥを使用すると、管理対象オブジェクトのライフサイクルについて、標準のCocoaオブジェクトの場合と同じように想定することはできません。管理対象オブジェクトは、必要に応じてフレームワークによってインスタンス化、破棄、および復活させることができます。
管理対象オブジェクトが作成されると、管理対象オブジェクトモデルでそのエンティティに指定されたデフォルト値で初期化されます。多くの場合、モデルに設定されているデフォルト値で十分です。ただし、場合によっては、モデルで表現できない動的な値(現在の日付と時刻など)を使用して、追加の初期化を実行したい場合があります。
通常、一時的なプロパティやその他の変数をクリアするために、deallocをオーバーライドしないでください。代わりに、didTurnIntoFaultをオーバーライドする必要があります。didTurnIntoFaultは、オブジェクトが障害に変わったとき、実際の割り当て解除の直前にCoreDataによって自動的に呼び出されます。特にメモリオーバーヘッドを削減するために管理対象オブジェクトを障害に変える可能性があるため(「メモリオーバーヘッドの削減」を参照)、didTurnIntoFaultでクリーンアップ操作を適切に実行することが重要です。
(managedObject.managedContext == nil)をチェックします。nilの場合、削除されました。これはAppleDocumentationによって保証されていませんが、私には問題なく機能しているようです。別のコンテキストで使用したり、保存されていない場合は、機能しません。`NSManagedObject`が削除されたかどうかを確認するにはどうすればよいですか?を参照してください。詳細については。