非常に興味深い状況に直面しましたが、解決方法がわかりません。最初に、私のプログラムのアーキテクチャの概要を説明します。my delegate プロトコルも実装する UITableViewController 派生クラスがあります。このテーブル ビューのセルはカスタム セルであり、それぞれがデリゲート (テーブル ビュー コントローラー) に強い (割り当て) 型のプロパティを持っています。デリゲートは、いくつかの UI アクションを処理します。
クラッシュを再現するために、テーブル ビューを読み込み、そこから移動します。通常、ここではテーブルビューの割り当てが解除されますが、私の場合、セルはまだそれへの強い参照を保持しているため、メモリに残ります。問題は、この後にメモリの警告がデバイスに届くとクラッシュすることです。私は次のことが起こると推測しました:
- テーブル ビュー コントローラがメモリ警告を受け取る
- すべての(再利用可能な)セルを解放します
- セルのデアロケートでは、デリゲート プロパティが nil であるため、リリースがテーブル ビュー コントローラーに送信されます。
- 最後のセルがそのプロパティをゼロにすると、テーブル ビューの参照カウントがゼロになるため、それ自体の割り当てが解除されます。
- セルを解放した後、テーブル ビューの didReceiveMemoryWarning のデフォルトの実装は続行されますが、既に割り当て解除されたゾンビ オブジェクト上にあります。
- 後でゾンビに対して viewDidUnload を呼び出すと、アプリがクラッシュすることがあります。
どうすればこの状況を解決できますか?
PS: もちろん ARC は使っていません。