2012-03-13 8 views
1

私はまだARCの考え方に苦しんでいます。非常に複雑なviewControllers AとBという2つの非常に複雑なビューがあり、それぞれにそれぞれのビューで保持される多数のピクチャがあるとしましょう。議論のために、最初のViewController(A)がRAMで75 MBを占めるイメージを保持しているとしましょう。他の1つ(B)も75 MBを占有します。私のアプリの委任でARC:viewControllerをnilに設定する場合

私はそうのように私のNavigationControllerを設定します。

ViewControllerA *vcA = [[ViewControllerA alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vcA]; 
[navController.navigationBar setHidden:YES]; 
[[self window] setRootViewController:navController]; 

私はAからBへ切り替えると、私はViewControllerA.mにそうようにそれを実行します。

ViewControllerB *vcB = [[ViewControllerB alloc] init]; 
[[self navigationController] pushViewController:vcB animated:YES]; 

Iを私はそれをViewControllerB.mのようにする:

[[self navigationController] popToRootViewControllerAnimated:YES]; 

私はまだViewContr私がViewController Bにいるときの私の記憶の中のオラーA?この場合、コンパイラはいつViewControllerを解放しますか? 1つのViewControllerが使用されていないときに、1つのViewControllerをリリースしてもいいですか?

答えがわかりやすかったり、その点が完全に不明な場合は申し訳ありません。だから、どんな答えや説明も高く評価されます。

答えて

0

それが解放されることはありませんので、あなたのビューコントローラAはnavControllerによって保持されます。vcAをnilに設定しても、navControllerはそれを保持しているため、リリースされません。 問題は、コントローラがたくさんのメモリを消費する多くのリソース(イメージ)を保持していたことです。これを解決するには、viewDidLoad上のリソースを割り当て、viewDidUnload

でそれらを解放することができます例えば

// in your view controller 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.image = // read image to memory 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.image = nil; // release the image to free memory 
} 

ビューコントローラBはからNavControllerにプッシュされた後、ビューコントローラのAは、それがあるとのUIKitで通知されます表示コントローラではなく、必要に応じてビューをアンロードして、他のクラスが使用するメモリを解放します。

+1

すみませんが、間違いだと思います。 ViewDidLoadとViewDidUnloadは、ビューが作成され、ビューが破棄される前(deallocの前)に呼び出されます。あなたはviewWillAppearとviewWillDisappearメソッドについて話をしたいと思っていました.WatchControllerのビューは表示/非表示になっています。最後に、それは私自身の意見ですが、コントローラーが表示されていれば、画像が一度読み込まれた方が良いでしょう。 – Martin

+0

ビューを表示/非表示にするたびにイメージを割り当てて解放すると、すべてのビューの変更は膨大な処理になり、アプリケーションが遅くなる可能性があります。 UIKitは、不必要なロード/アンロード作業を節約するためにビューをアンロードするタイミングを知っています。 –

+0

私はあなたに完全に同意します。私が言うことは、例えば、initWithNibName/Deallocメソッドよりも、viewDidLoad/viewDidUnloadのイメージの割り当て/解放に違いがないということです。 – Martin

1

はい、あなたはまだViewControllerAを持っています(これは次回インストゥルメントで見ることができます)。それはARCとは関係がありません。それがなければ同じです。

UINavigationControllerを作成し、UIViewController Aをルートとして配置します.Aは保持されます(ARCでは、これは強力なプロパティまたはそのようなものです)。 UIViewController B、BおよびAがメモリに存在するようにプッシュすると、UINavigationControllerにはまだUIViewController Aが必要です。表示されないだけで、システムがメモリを必要とする場合はビューをアンロードできますが、Aを解放しません。UIViewController B、それは解放され、それについての参照がない場合(これはARCがどのように動作するかを仮定しています)、解放されます。

ここで、あなたの質問は、いつrootViewControllerが割り当て解除されるのですか?まあ、UINavigationController 常ににはルートがあります!したがって、あなたはUINavigationControllerを持っている間、あなたはrootViewControllerを持っています。

さらに説明が必要な場合は、コメントにお知らせください。

1

私はARCを手助けすることはできません。なぜなら、私はそれを一度も使用していないからです。

しかし、私はあなたに一つのことを伝えることができます:

を、あなたのViewControllersを押すと、彼らはすべてのナビゲーションスタックです。彼らがスタックに入るまで、彼らは記憶に残ります。

ARCを使用せずに、私がviewControllerをオートリリースすると、私はスタックからポップするときにそれをリリースします。

誰かがARCについてもっと知っていると(割り当てられたオブジェクトを解放したとき)、私はより多くの情報を持ってうれしいです。

おかげ

関連する問題