2011-08-25 4 views
3

に解放するためにどのくらいのアップルテンプレートはviewDidUnloadでこのコメントを提供します。問題は、他のすべての保持されているivarオブジェクトですが、そのうちのいくつかはプログラムで追加されたビューですが、他のものはデータモデルですが、これらの2つのメソッドでも処理されるべきですか?そうでない場合は、どうしてですか?はviewDidUnload

この回答hereから私は唯一のビュー関連のオブジェクトは、おそらく非IB Outletが正しい、意見を留保含むべきviewDidUnload=nilなどのステートメントに行く必要があることを集めますか?その後、他のすべてのオブジェクト(データモデルを含む)は、としてreleaseとなります。これは通常の練習ですか?

答えて

1

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; 
} 
+0

:セッターを使用して保持するプロパティにnilを代入

はリリースが、あなたがself.myOutlet = nilを書くとき、あなたがこのような何かを実装されているsetterメソッドを呼び出している、それらに送信されますデータモデルをビューコントローラのivarとして使用し、ビューコントローラのビューがアンロードされた場合にこのデータをメモリに保持したい場合は、viewDidLoadはこのモデルを作成するのに適していないようです。あなたはこのような状況でビューコントローラのivarsを作成するためのデリゲートメソッドをお勧めしますか?あるいはもっと一般的には、Core Dataを介してデバイス上のデータを永続させるだけかもしれません。私の問題は、データモデルがWebからそのコンテンツを取得することです。それを解放するには、後でそれを使用し続けるために別のダウンロードが必要です。 – johnbakers

+0

ウェブからデータをダウンロードしている場合は、通常、簡単に再作成することはできません。私はそれをリリースしない、またはコアのデータ、plist、またはNSUserDefault、またはSQL DBのサイズと構造に応じてそれを格納します。 – progrmr

関連する問題