viewDidUnloadは、現在表示されていないビューコントローラのビューをアンロードするためのメモリ不足の結果として呼び出されます。この時点で、ビューコントローラのビューオブジェクトがリリースされました。つまり、viewController.viewのサブビューであるすべてのオブジェクトが解放されたことを意味しますが、ivarsでそれらを保持している場合は割り当て解除されません。
ビューを再読み込みするときに再作成されるオブジェクトや、必要に応じて簡単に再作成できるものを解放する必要があります。次にビューを使用すると、ビューはNIBかloadViewを呼び出すことによって再作成されるので、解放したものはすべて再作成されます。
ビューがNIBに由来する場合、NIBで指定されたすべてのビューオブジェクトが作成され、ビューコントローラのビューのサブビューとして追加されます。 IBOutletsを持つすべてのivarsもサブビューに接続されているので、それらのオブジェクトを所有している(あなたはそれらを保持しています)。あなたは実際にdealloc'dを得るためにそれらのイーバールを解放する必要があります。
loadViewでプログラムによって作成されたビューは、次回のビューのロード時にloadViewで再作成されるivarsによって保持されるオブジェクトも解放する必要があります。
データモデルなど、viewDidLoad(またはviewWillAppearまたは他の場所)で作成したものと同じですが、後でビューが再度ロードされたときやオブジェクトが必要なときに「簡単に」再作成できる場合は、viewDidLoadメモリ使用量を削減します。実際には、データモデルのような非ビュー項目については、代わりにdidReceiveMemoryWarningで解放します。あなたが保持ahve場合
-(void)setMyOutlet:(id)newObject
{
[newObject retain]; // does nothing if newObject is nil
[myOutlet release];
myOutlet = newObject;
}
:セッターを使用して保持するプロパティにnilを代入
はリリースが、あなたが
self.myOutlet = nil
を書くとき、あなたがこのような何かを実装されているsetterメソッドを呼び出している、それらに送信されますデータモデルをビューコントローラのivarとして使用し、ビューコントローラのビューがアンロードされた場合にこのデータをメモリに保持したい場合は、viewDidLoadはこのモデルを作成するのに適していないようです。あなたはこのような状況でビューコントローラのivarsを作成するためのデリゲートメソッドをお勧めしますか?あるいはもっと一般的には、Core Dataを介してデバイス上のデータを永続させるだけかもしれません。私の問題は、データモデルがWebからそのコンテンツを取得することです。それを解放するには、後でそれを使用し続けるために別のダウンロードが必要です。 – johnbakersウェブからデータをダウンロードしている場合は、通常、簡単に再作成することはできません。私はそれをリリースしない、またはコアのデータ、plist、またはNSUserDefault、またはSQL DBのサイズと構造に応じてそれを格納します。 – progrmr