2010-11-18 13 views
2

UITabBarControllerをメインフォームとしたアプリケーションを作成していますが、少し前にこれを実行してから少し問題が発生しました。UITabBarControllerメモリの警告後にビューを割り当て解除する

4つのタブのうちの2つで、View Controllerは標準のナビゲーションコントローラを使用してドリルダウンし、カテゴリをブラウズして項目を参照すると、カテゴリと項目にはかなりの画像があります。私が取得(4枚の320x460画像のscrollviewが使用されているアイテムの段階まで)私のアプリを使用して数分後

..

Received memory warning. Level=1 

これは、ビューの現在、私の中で開催されたのすべてが割り当て解除ですUITabBarControllerをクリックしてタブをクリックすると、白い画面しか表示されません。

画像を使用している場合、私は..できるだけ

UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"image"]]; 
[self.view addSubview:imageView]; 

..asを使用しようとしています、私の知る限り承知しているとして、それは「メモリの管理」であり、かつ正確にdealloc必要があります。

メモリの問題は、メモリにロードされている4つの大きな画像が原因であると思います。これは私のアプリケーションの要件です。タブの消滅はありません:/

アイデア/ガイダンス?

+0

私はあなたがのviewDidLoadとviewDidUnloadの価値を誤解と信じています。また、いつでも自動解放プールを取り除き、手動保持/解放カウント管理を行うべきです。あなたの場合、それはむしろ簡単です:UIImageView * imageView = [[UIImageView alloc] init]; [imageView setImage:[UIImage imageNamed:@ "image"]]; [self.view addSubview:imageView]; [imageView release]; –

答えて

3

これは仕様です。あなたのアプリケーションがメモリ警告を受け取ると、現在表示されていないすべてのView Controllerがそのビューをアンロードします。あなたはそれに備えなければなりません。ユーザーがアンロードされたタブを再度開くと、ビューコントローラーはビューをリロードし、ビューのセットアップを行う場所で-viewDidLoadを再度呼び出します。

+0

ありがとう、私は答えを知っているとき、それは簡単です!、木の男から木を見るのを手伝ってくれてありがとう。 – Bongeh

+0

ビューがXIBから読み込まれた場合はどうなりますか?以前のviewDidLoadの呼び出しで割り当てた可能性のあるオブジェクトはどうですか?これらの割り当てをすべてやり直すと、以前のすべてのインスタンスがリークします。 – Oscar

+0

@Oscar:NIBかどうかで違いはありません。プロセスはまったく同じです。メモリを無駄にしたりリークしたりしないためには、 'viewDidUnload'メソッドで' viewDidLoad'に割り当て/保持しているものすべてを解放する必要があります。ドキュメントでは、これについて詳細に説明しています。 –

1

オレはまともな説明をしました。ただし、画面外のビューコントローラのビューがアンロードされた場合は、-loadViewに再度設定する必要があります。 このメソッドはビュー階層を設定するために呼び出され、次に-viewDidLoadが呼び出され、ビューが準備完了であることを知らせます。 -viewDidLoadに実装すると、空のビューが読み込まれ(UIViewController -loadView)、次に(-viewDidLoadコードに置き換えられ)、フリッカーが発生します。

あなたの意見を読み込むについても、より精巧な説明はここにあります:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/

+0

XIBから画面がロードされている場合は、loadViewをオーバーライドしません。 – Oscar

関連する問題