2

コア データ ガイドラインでは、逆の関係をモデル化することを推奨しています。問題ありません。

興味深いことに、B と多対多の関係を持つオブジェクト A をロードし、オブジェクト グラフをウォークすると、保持サイクルが発生し、メモリが解放されることはありません。

単純なオブジェクト グラフの場合は、A で refreshObject:mergeChanges: を呼び出すだけでオブジェクトを再フォールトして、関係が強い参照ではなくなるようにすることができます。

複雑なオブジェクト グラフがある場合、触れたすべてのオブジェクトでそれを呼び出す必要があるため、これは面倒です。コア データを使用する場合、これは非常に重要な考慮事項のように思えますが、Apple のドキュメントにはこのトピックに関する段落が 1 つしかありません。

他の人がこれをどのように処理するのだろうか?長時間実行されるアプリは、オブジェクトを強制的に障害状態に戻す何らかの手動プロセスを使用しなくても、メモリを徐々に消費していきます。

これに対処するための既知のパターンはありますか。多くの人がCore Dataを使用しているため、推奨事項が見つからないのではないかと思います

4

1 に答える 1

1

アサーションを作成するときに、コア データのいくつかの側面を無視しています。オブジェクトをフェッチする場合、たとえばオブジェクト A をオブジェクト B と 1 対多の関係にあるとします。A をフェッチすると、A に関連する B 上のすべてのオブジェクトが取得されます。1 対多の関係は、 A に関連するオブジェクトのリストで、NSManagedObject サブクラスの NSSet プロパティに含まれています。これらのオブジェクトはフォルト状態にあり、これによるメモリ フットプリントはわずかであることに注意してください。リレーションシップ内のオブジェクトを操作すると、コア データは必要に応じてこれらのオブジェクトをアンフォールトします。この動作を取得するために何もする必要はありません。フォルト動作を自分でトリガーして、オブジェクトを再びフォルトに送りたい場合は、refreshObject:mergeChanges: を使用できます。あなたがそれらを障害に送り返さない場合、

于 2012-10-12T16:25:20.420 に答える