2011-08-09 4 views
1

私は別のチームによって書かれたコアデータを使用してiPhoneアプリのコードを継承しました。オブジェクト間の関係やオブジェクトがコードでどのように作成/使用されているかを見ると、永続的な記憶域にメモリリークがあったことがわかりました。オブジェクトが残っているコアデータからトップレベルのオブジェクトをすべて削除しても十分です。さらに、あるオブジェクトの値/関係が別のオブジェクトにコピーされ、これがコアデータ内の孤立したオブジェクトに残る操作がありました。永久記憶域へのメモリリーク

私はこの問題を修正して以来、コアデータに新しい孤立したオブジェクトが保存されることはなくなりました。問題は今、どのくらいの時間を知っている人のために漏れのあるアプリを使用していた既存のユーザーの永続的なストレージからこれらの孤立したオブジェクトを削除するのですか?

私の最初の考えは、トップレベルのオブジェクトを別のManagedObjectContextにコピーすることでした。その後、元のコンテキストからすべてのオブジェクトを削除します。最後に、トップレベルのオブジェクトを元のコンテキストにコピーし直します。誰もがこれに何か問題を見ているか、より良いアイデアを持っていますか?

答えて

1

孤立したオブジェクトは、空の関係をフェッチして返されたオブジェクトを削除できるように、空の関係を持つ必要があります。

孤立したオブジェクトを防ぐために、データモデルを更新する必要があります。孤児は通常、ひどく設計されたモデルの兆候です。すべてのリレーションシップに相互関係があることを確認し、必要に応じてリレーションシップを必要とするようにします。また、孤児を防ぐための検証を追加することもできます。

+0

問題の一部であるデータモデルについてはあなたが正しいです。 Cascadeの代わりにNullifyに設定された関係がいくつかありました。私はあなたがバリデーションによって意味するものについて興味があります。どのように検証する? – iHorse

+0

空の関係を取得することに同意します。検証のために、彼はあなたがvalidateFor <...>の管理対象オブジェクトクラスの挿入、更新、削除を無効にしてそこにいくつかのロジックを置くことができることを意味します。失敗した場合、オブジェクトは保存されません。「孤児のためオブジェクトを保存できません...」のような独自のエラーメッセージを作成して上げるオプションがあります。 – Leonardo

関連する問題