多くの人が のポイントを誤解していviewDidUnload
ます。特に、 に対応するものではありませんviewDidLoad
。ほとんどの場合、View Controller はviewDidUnload
呼び出されることなく割り当て解除されます。このため、 での割り当ての適切なバランスでの割り当て解除を考慮すべきではありません。viewDidUnload
viewDidLoad
viewDidUnload
Apple によって廃止されました。おそらくそれを使用することに対する最良の議論は、そのヘッダーです(私はラップしました):
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); // Called after the view
// controller's view is released and set to nil. For example, a memory warning
// which causes the view to be purged. Not invoked as a result of -dealloc.`
それで、何だったviewDidUnload
のですか?その背後にある考え方は、ビューがビュー コントローラーの背後からアンロードされているということです。これにより、それへのポインターを切り離し、簡単に再構築できる情報をクリアする機会が得られます。ビューはおそらく再び読み込まれ、その時点でキャッシュを再構築する必要があります。Apple はこれについて次のように説明しています。
メモリ不足の状態が発生し、現在のビュー コントローラーのビューが必要ない場合、システムはそれらのビューをメモリから削除することを選択する場合があります。このメソッドは、View Controller のビューが解放された後に呼び出され、最終的なクリーンアップを実行するチャンスです。ビュー コントローラがビューまたはそのサブビューへの個別の参照を格納している場合は、このメソッドを使用してそれらの参照を解放する必要があります。このメソッドを使用して、ビューをサポートするために作成したオブジェクトへの参照を削除することもできますが、ビューがなくなったために不要になりました。このメソッドを使用して、ユーザー データや、簡単に再作成できないその他の情報を解放しないでください。
viewDidUnload
オブジェクトへの参照をゼロにすることは、今は不要であることを覚えておいてください。Apple の推奨に従って ARC を使用している場合、ビュー アウトレットは弱い参照をゼロにしています。あなたが書かなくても、それらは自動的にnilledされますviewDidUnload
!
さらに、キャッシュ情報をクリアすることは に適してdidReceiveMemoryWarning
いるため、代わりに次のように記述した方がよいでしょう。
このメソッドをオーバーライドして、View Controller が使用する追加のメモリを解放できます。その場合、このメソッドの実装は、ある時点でスーパー実装を呼び出して、View Controller がそのビューを解放できるようにする必要があります。ビュー コントローラーがビュー階層のビューへの参照を保持している場合は、viewDidUnload
代わりにメソッドでそれらの参照を解放する必要があります。
一般に、人々が入れたものは、またはviewDidUnload
で処理する方が適切です。残っている唯一のことは、ビューがリロードされた後のある時点で必要になったときに、ビュー コントローラーがまだ開いている間にデータを失うことなく再構築できるキャッシュを消去することです。(また、これは で処理する必要があります。) これらのキャッシュは遅延して構築する必要があります。アプリが再びそれらを必要とするとき、静かにそれらを再構築します。viewDidDisappear
dealloc
viewDidUnload
didReceiveMemoryWarning
それで、あなたは何をすべきですviewDidUnload
か?ARC を使用している場合: 何もありません。それも書かないでください。実際、この回答が書かれて以来、Appleは廃止されviewDidUnload
ました。
の場合CGContextRelease
、CGContext
リソースは Objective-C オブジェクトではありません。(ご指摘のとおりですが、後世のために繰り返したいと思います。) そのため、ARC によって自動的に割り当てを解除することはできません。古い Manual Retain Release (MRR) メモリ管理スキームと同様に、割り当てが解除され、nil されていることを確認する責任があります。
このコードを に入れてviewDidUnload
も、呼び出される保証はありません。入る必要がありdealloc
ます。入れることもできviewDidUnload
ますが…</p>
など:
- 不要または役に立たない。インスタンス変数は、ビュー階層に比べてごくわずかです。
- 不要または役に立たない。プロパティは、ビュー階層に比べて非常に小さいです (プロパティがビュー階層への強い参照でない限り)。
dealloc
通常は なしで呼び出されるため、これによりメモリ リークが発生しますviewDidUnload
。
- 不要または役に立たない。ポイント1と2を参照してください。