2009-11-24 12 views
6

私は、別のクラスのプレーヤーと多対多の関係を持つコアデータクラスのゲームを持っています。これは私がゲームのクラスに、didTurnIntoFaultが呼び出されていないしていることを最後に外部参照を解放していた場合、そのヘッダーがコアデータと保持サイクル

@property (nonatomic, retain) NSSet * players; // In Game.h 
@property (nonatomic, retain) Game * game; // In Player.h (the inverse relationship) 

のように見えるものです。さて、私の質問は、上記の循環参照のためである可能性があります(ご覧のとおり、両方のプロパティが '保持'されています)、またはコアデータがすべてを管理し、問題がコードのどこかにあります。

答えて

4

Core Data Programming Guide: Memory Management (Breaking Relationship Retain Cycles)を参照してください。

管理オブジェクト間の関係がある場合、各オブジェクトは関連するオブジェクトへの強い参照を維持します。これにより、管理対象メモリ環境では、不要なオブジェクトの割り当て解除を防ぐ保持サイクル(Object Ownership and Disposalを参照)が発生します。保持サイクルが壊れていることを確認するには、オブジェクトが終了したら管理オブジェクトコンテキストメソッドrefreshObject:mergeChanges:を使用して障害に変換します。

通常、管理対象オブジェクトのプロパティ値を更新するには、refreshObject:mergeChanges:を使用します。 mergeChangesフラグがYESの場合、メソッドはオブジェクトのプロパティ値を永続ストアコーディネータで使用可能なオブジェクトのプロパティ値とマージします。ただし、フラグがNOの場合、このメソッドはオブジェクトをマージせずに障害に戻すだけで、関連する管理対象オブジェクトを解放します。これにより、その管理対象オブジェクトと、その管理対象オブジェクトが保持していた他の管理対象オブジェクトとの間の保持サイクルが中断されます。

+0

私はRTFMを誓うことができますが、それは私を逃しました:) ありがとうとにかく! – Manav

+2

これを再帰的に行う必要があると付け加えることもできます。つまり、管理対象オブジェクトのサイクルを破ることは、子オブジェクトが持つサイクル – Manav

関連する問題