ビュー階層内のビューへの強い参照がある場合、viewDidUnloadでそれをnilに設定する必要がありますか、それともARCによって処理されますか?
2 に答える
前の 2 つの回答には非常に多くの誤った情報が含まれているため、状況を正確に説明します。これらは、ビルドに iOS6 SDK を使用するかどうかではなく、DEPLOYMENT ターゲットに関連していることに注意してください)。
self.view について心配する必要はありません - UIViewController がそれを管理します
最上位のオブジェクト (つまり、別のオブジェクトに含まれていないもの) は強力でなければなりません
他のオブジェクトはweakを使用する必要があります(リリースされたオブジェクトを使用しようとするクラッシュを防止するために、システムnilはリリースされたときにivarです)
iOS6 より前のデバイスに配置するには、viewDidUnload を使用してトップ レベルのオブジェクトと必要なものをすべて解放します。注: この後、dealloc は呼び出されません。メッセージの原因となったメモリの問題がなくなり、ビューが再び表示されると、次のメッセージはおそらく viewDidLoad になる可能性があります)。
iOS6 以降では、viewDidUnload を使用しないでください (以下の編集を参照)。ビューやその他の UI オブジェクトに関連しないメモリを解放する場合は、didReceiveMemoryWarning を使用してください。
dealloc はすべてのリリースで呼び出されます。ARC では、super を呼び出さず、昔のようにメモリを解放しません。
編集: iOS6 SDK UIViewController クラスの説明から:
viewDidUnload コントローラのビューがメモリから解放されたときに呼び出されます。(iOS 6.0 では廃止されました。メモリ不足の状態でビューが消去されなくなったため、このメソッドが呼び出されることはありません。)
Apple が行うことは、バッキング ストア (キャッシュされたピクセル) を削除することです。彼らは、これにより消費されたメモリのほとんどが削除され、viewDidUnload の実装が不十分であることを発見しました (WWDC 2012 でこのことを教えてくれました)。
オブジェクトへの参照を持つivarがある場合、strong
そのivarがそれを指している限り、そのオブジェクトはぶらぶらします。
したがって、はい、ポインタをに設定する必要があります。そうしないとnil
、強力な参照によってビューが存続します。ビューがペン先からロードされていて、そうでない場合は、この問題を心配する必要がないようrootView
に使用することをお勧めします。weak