2009-08-23 9 views
0

私はsqlite dbからデータを取り込むtableviewcontrollerを持っています。各行について、httpサーバからファイルをダウンロードしてローカルにキャッシュします。 「detailsview」が開かれたときにのみキャッシュします。また、detailsviewは、ファイルのダウンロードが完了した後に、代理人を介してこのテーブルに応答します。このテーブルビュー自体はnavicontrollerの外にポップさObjective Cのメモリ管理に関する質問

しかし、。、デリゲートの呼び出しは、私が表示し、すべてが正常に動作します細部のsetDelegateに[_delegate保持]と呼ばれるEXEC_BAD_ACCESS

で失敗しますが、Iこれがメモリをリークするかどうかわからない...

誰でも助言できますか?

答えて

2

あなたの代理人は途中で解放されています。無効なオブジェクトにメッセージを送信すると、EXEC_BAD_ACCESSが呼び出されます。それを保持すると問題は解決しますが、一般的には、保持サイクルの可能性があるため、デリゲートを保持しないオブジェクトを持たないことをお勧めします。したがって、構造を再考する必要があります。ビューがdeallocされているときにデリゲートを解放する場合は、デリゲートをsetDelegate:に保持しない限り、ビューを削除する必要があります。

2

一般的に、代理人は保持サイクルを避けるために保持されません。デリゲートがあなたより前にリリースされている場合、デリアテートが終了する前に参照をクリアするのはデリゲートの責任です(デオロックなど)。

しかし、いずれかのプロパティが "retain"または "copy"に設定されている場合は、それをセッターで保持/コピーします(または、@synthesizedセッターを使用して行います)。漏れを避ける。しかし、上記のように、それは保持するサイクルにつながるので、どちらのオブジェクトも割り当て解除されない可能性があります。

環境変数NSZombieEnabledとNSAutoreleaseFreedObjectCheckEnabledでメモリデバッグを有効にして、どのオブジェクトが解放されているかを確認するかどうかを確認することをお勧めします。

関連する問題