6

iOSアプリの場合、ARCを使用して、通常これらをでリリースしviewDidUnloadますか?

  1. すべてのインスタンス変数をに設定しますnil

  2. すべてのプロパティをに設定しますnil

  3. CGContextRelease、CGImage with CGImageRelease、およびcolor space withを使用してコンテキストをCGColorSpaceRelease解放します(非オブジェクトを解放します)

  4. 要素について特別な注意を払う必要はありませんNSMutableArray。NSMutableArrayNSSetとNSSetへの参照をnilに設定するだけで、各要素が自動的に解放されます。

これらを実行すると、ARCでのほとんどのメモリ解放が処理されますか?他にもリリースが必要なアイテムはありますか?

4

2 に答える 2

14

多くの人が のポイントを誤解していviewDidUnloadます。特に、 に対応するものではありませんviewDidLoad。ほとんどの場合、View Controller はviewDidUnload呼び出されることなく割り当て解除されます。このため、 での割り当ての適切なバランスでの割り当て解除を考慮すべきではありませんviewDidUnloadviewDidLoad

viewDidUnloadApple によって廃止されました。おそらくそれを使用することに対する最良の議論は、そのヘッダーです(私はラップしました):

- (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で処理する方が適切です。残っている唯一のことは、ビューがリロードされた後のある時点で必要になったときに、ビュー コントローラーがまだ開いている間にデータを失うことなく再構築できるキャッシュを消去することです。(また、これは で処理する必要があります。) これらのキャッシュは遅延して構築する必要があります。アプリが再びそれらを必要とするとき、静かにそれらを再構築します。viewDidDisappeardeallocviewDidUnloaddidReceiveMemoryWarning

それで、あなたは何をすべきですviewDidUnloadか?ARC を使用している場合: 何もありません。それも書かないでください。実際、この回答が書かれて以来、Appleは廃止されviewDidUnloadました。

の場合CGContextReleaseCGContextリソースは Objective-C オブジェクトではありません。(ご指摘のとおりですが、後世のために繰り返したいと思います。) そのため、ARC によって自動的に割り当てを解除することはできません。古い Manual Retain Release (MRR) メモリ管理スキームと同様に、割り当てが解除され、nil されていることを確認する責任があります。

このコードを に入れてviewDidUnloadも、呼び出される保証はありません。入る必要がありdeallocます。入れることもできviewDidUnloadますが…</p>

など:

  1. 不要または役に立たない。インスタンス変数は、ビュー階層に比べてごくわずかです。
  2. 不要または役に立たない。プロパティは、ビュー階層に比べて非常に小さいです (プロパティがビュー階層への強い参照でない限り)。
  3. dealloc通常は なしで呼び出されるため、これによりメモリ リークが発生しますviewDidUnload
  4. 不要または役に立たない。ポイント1と2を参照してください。
于 2012-06-28T06:03:56.593 に答える
1

viewDidUnload にはトリッキーな名前が付けられています。適切に考えれば、そこに何が入っているかを理解するのは非常に簡単です。

最初に知っておくべきことは、iOS デバイスのメモリ処理方法が少ないということです。これは、デバイスがより多くのメモリを必要とする場合、どのアプリからメモリを解放できるかを確認することを意味します。これは、ViewDidUnload メソッド (不適切な名前が付けられている可能性があります) を呼び出すことによって行われます。

したがって、ここで再構築できるすべてのものを nil に設定することをお勧めします。(viewdidload で作成したものすべて)。

例外は、データまたは何かを取得するのに時間がかかる可能性があるため、オブジェクトを失う余裕がない場合です。

この viewdidload を実装しないと、アプリはアイテムとオブジェクトを保持し、iOS はそこから何も解放できなくなります。

SO 基本的に私が言ったように、viewdidload で安全に再構築できるすべてのものを (それらのオブジェクトを指す要素を nil に設定することによって) 解放します。(これは、ビューがアンロードされ、再度ロードされた後に確実に呼び出されます)

于 2012-06-08T00:23:18.643 に答える