2009-08-06 10 views
0

私のUIViewControllerは、別のコントローラを呼び出すと解放されますか? 私は別のコントローラにプッシュするとコントローラのメモリを解放するには?私は40Mo以上を取って、LOW MEMORY(No leak)のためにアプリケーションを離れる。Iphone - プッシュ後にコントローラを解放しますか?

[self.navigationController pushViewController:[[MainListController alloc] init:self] animated:NO]; 

@interface MainListController : UIViewController 
... 
- (id)init: (id)ref; 

私があったコントローラののdealloc init関数を呼び出す:

objc[70754]: FREED(id): message isEqual: sent to freed object=0xe216b0 
Program received signal: “EXC_BAD_INSTRUCTION”. 
  • (ボイド)のdealloc {[スーパーのdealloc:

    [ref dealloc]; 
    

    私はこのエラーをしました];}

+0

@Nicolas:上記のコードは、絶対に漏れています。 navigationControllerはあなたのコントローラを保持しており、あなたはそこにオートレリースせずにコントローラを作成しています。あなたはこのようにコントローラを押すたびに漏れてしまいます。あなたは次のようなことをしなければなりません:[self.navigationController pushViewController:[[[MainListController alloc] init:self] autorelease] animated:NO]; –

+0

また、View Controllerのinit:self呼び出しのコードに渡した変数が保持されていないこと、または保持サイクルがあること、およびこのナビゲーションコントローラの作成方法や場所によっては漏れが発生する可能性があることも確認してください。 –

+0

私はこのコントローラに戻って来ないので、私はメモリを失うことはありません。そのため、私はそれをリリースしたいのです!別の解決策がありますか? – NicoMinsk

答えて

3

いいえ、あなたc dealloc UIViewControllersは表示されません。一番上のコントローラがナビゲーションコントローラを飛び飛ばすとどうなりますか?その後、OSは何を表示しますか?

代わりにすべてのコントローラにdidReceiveMemoryWarningメソッドを実装する必要があります。これらはできるだけキャッシュと同じようにreleasedeallocではない)です。ディスクから再計算または取り戻すことができるものはすべて考慮する必要があります。

これは、実際にどのくらいのメモリが利用可能であるかを実際に知ることができないため、表示されないビューを表示するよりも優れています。 iPhone 3GSでは、40Mbを使用しても十分なメモリが残っている可能性があります。

+0

didReceiveMemoryWarningを手動で呼び出すことはできますか? – NicoMinsk

+0

することができますので、あなたがするべきではありません。あなたが本当にMainListControllerにフリップするときにメモリを解放したいのであれば、pushViewControllerメソッドを呼び出す前にメモリを解放してください。 –

+0

私は[self release]を呼び出します。 より前 [self.navigationController pushViewController:[[MainListController alloc] init:self] animated:NO]; それは働いています、確かです、私は悪いアクセスをしませんか?なぜなら私は自分自身を解放し、self.navigationをやった後です...ありがとう。 – NicoMinsk

4

ナビゲーションスタックに新しいビューコントローラをプッシュするとき、親ビューコントローラを解放/解除できません。 didReceiveMemoryWarningメッセージに応答してビューをアンロードすることができます。

  1. これまで手動で[obj dealloc]を呼び出すことはありません:

    はあなたのコードにはいくつかの他の問題があります。常に[obj release]を使用してください。

  2. initメソッド名は、あらかじめ定義されたinitメソッドと矛盾しないように、よりわかりやすい名前にする必要があります。また、使用する必要がある場合は、(おそらく)ref引数を強く入力する必要があります。 (id)initWithParent:(UIViewController*)refのようなものが良いでしょう。
  3. MainListControllerオブジェクトが割り当てられているため、/ init 'してからnavigationControllerに渡すので、あなたのコードはMainListControllerオブジェクトをリークしています。コードを[[[MainListController alloc] initWithParent:self] autorelease]に変更します。
関連する問題