2012-05-10 7 views
1

私は2つのビューコントローラVC1とVC2を持っています。私は、VC2のオブジェクトを作成し、それをボタンアクションに押してVC2を押し込もうとします。私はボタンアクションでそれをポップしていますVC2で目的のCでUINavigationControllerを押してポップするときのメモリの問題

VC2 *vcOject = [[VC2 alloc]init]; 
[self.navigationController pushViewController:vcOject animated:YES]; 
[vcObject release]; 

..

[self.navigationController popViewControllerAnimated:YES]; 

は、今私はVC1で午前再び表示するためにVC2を押します。今度はEXC_BAD_ACCESSエラーが表示されます。しかし、私は[vcObject release]とコメントしました。それはうまく動作します。いつ私はメモリを解放することができます。ナビゲーションコントローラでのメモリの処理方法

答えて

1

簡易回答:あなたはARCを使用しているはずです。

何らかの理由でビューコントローラがスタックからポップされたら、割り当て解除され、スタックにプッシュするたびに新しいコントローラを割り当てる必要があります。 VC2のビューが非常に重い場合は、[vcObject release]を取り除き、VC1にはvcObjectへの参照を保持し、同じものをスタックに押し続けます。あなたはこれら二つを混ぜないようにしてください。新しいオブジェクトをスタックにプッシュした後に解放する必要があるたびに新しいオブジェクトを作成し、毎回同じVC2をスタックにプッシュするリファレンスを保持している場合は、VC1のdeallocまで解放しないでください。 はVC1のdeallocメソッドでをリリースする必要があります。そうしないと、メモリがリークします。

しかし、本当に。 ARCを使用する必要があります。

+0

を使用せずに、プッシュ/ポップのViewControllerでメモリ管理を処理する方法です。私はARCを使用していません。いつdealloc menthodが呼び出されますか。私がプッシュ/ポップビューコントローラ、それは呼び出されていません。どのように私はそれをリリースすることができます。私はあなたの2番目の提案を使用しています。私はオブジェクトの参照を保持しているので、次回は同じオブジェクトをプッシュするだけです。 deallocメソッドが呼び出されていません。 –

+0

deallocメソッドは、View Controllerが割り当て解除されたときに呼び出されます。あなたはそれを担当していない、ランタイムは、それが必要なときに呼び出されることを確実に安心している。実際には、コントローラのビューがビュー階層から削除されたとき、またはアプリケーションが終了したときのいずれかです。あなたが正しいことをしている限り、あなたは記憶を漏らさないでしょう。 Objective-Cを書くことについて誰も言わないことの1つは、書くすべてのクラスに対してdeallocをオーバーライドし、すべてのインスタンス変数を解放する必要があるということです。 –

+0

さて、あなたはiOS 4.3でARCを使うことができますが、それは少し不自由なので、私はあなたがしたくない理由を得ます。 –

1

[vcObject release]を使用しない場合。アプリケーションにメモリリークが発生します。

ので、これは私がXcodeの4.0(IOS 4)で働いていますARC

VC2 *vcOject = [[VC2 alloc] init]; 
[[self.navigationController pushViewController:vcOject animated:YES] autorelease]; 
関連する問題