4

ARCなしでiPhoneアプリにxcode4.2を使用---

Interface Builderを使用してアウトレットを作成すると、xcodeはviewControllerに2行のコードを追加します。1つはviewDidUnloadに[self setMyOutlet:nil]あり、2つ目はdeallocにあり[myOutlet release]ます。

私は後者(リリース)を理解しています。しかし、なぜviewDidUnloadでアウトレットをnilに設定するのですか。viewDidUnloadはdeallocの前に呼び出され、アウトレットをnilに設定すると、deallocでのリリース操作が無効になりませんか?nilに設定することは、ガベージコレクションを使用するMacアプリケーションを構築することには意味がありますが、iPhoneアプリには意味がありません。

なぜインターフェイスビルダーはこれを行うのですか?アウトレットをnilに設定した行を削除する必要がありますか?

4

2 に答える 2

3

viewDidUnload呼び出される場合と呼び出されない場合があります。現在のメモリ使用量によって異なります。すべてのプロパティ(配列、カスタムオブジェクトなど)deallocをクリーンアップする必要がある場所です。あなたの中で、ビューと、おそらくビューをサポートするために作成されたオブジェクトをクリーンアップします。これは、ビューがアンロードされ(View Controller全体ではない)、将来、作成されて再度ロードされる可能性があることを意味します(もちろん、viewDidLoadで)。viewDidUnloadviewDidUnload

于 2012-04-16T19:01:08.660 に答える
0

viewDidUnloadは、deallocの前に毎回呼び出されるわけではありません。アップルのドキュメントの内容を参照してください。

低メモリ状態が発生し、現在のView Controllerのビューが不要な場合、システムはそれらのビューをメモリから削除することを選択する場合があります。このメソッドは、ビューコントローラのビューが解放された後に呼び出され、最終的なクリーンアップを実行するチャンスです。ビューコントローラがビューまたはそのサブビューへの個別の参照を格納している場合は、このメソッドを使用してそれらの参照を解放する必要があります。このメソッドを使用して、ビューをサポートするために作成したが、ビューがなくなったために不要になったオブジェクトへの参照を削除することもできます。この方法を使用して、ユーザーデータや簡単に再作成できないその他の情報を解放しないでください。

そのため、その背後にある考え方は、簡単に作成できる不要なオブジェクトを解放することです。ここで、プロパティをnilに設定する部分に行きます。これは、この方法ですべてのメモリを解放し、オブジェクトをnilに設定して(したがって、メモリ使用量を減らします)、その後、deallocがアプリと呼ばれる場合に行うためです。 Objective-cのようにクラッシュすることはありません。リリースメッセージをnilオブジェクトに送信できます。

アップルのViewControllerプログラミングガイドを読むことをお勧めします。それはあなたの質問の多くをクリアするでしょう....これが空気の一部をクリアすることを願っています..:D

于 2012-04-16T19:07:01.760 に答える