2011-02-06 9 views
2

私のアプリケーションにこのコードがあり、 'gvc'のメモリリークがあります。UIViewControllerがメモリリークまたは自動リース時にクラッシュするアプリケーション

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 

私はビューコントローラを自動解放するためにこのコードを変更した場合、それはエラーを与えて、しばらくして私のアプリがクラッシュ「不在メソッド」

GameViewController* gvc = [[[GameViewController alloc] init] autorelease]; 
[self.navigationController pushViewController:gvc animated:YES]; 

は自動解放に何か問題はありますか?どのようにこのメモリリークを解決するには? ありがとうございます。

+0

メモリリークがある特定のツールはどれですか? –

+0

XCodeのビルドと分析でメモリリークが表示されます。 – Cool

答えて

1

すべて完了したらすぐに放してください。常に必要な場合は、GameViewController *gvc;をヘッダに入れ、[gvc release];をdeallocメソッドに入れます。

+0

このgvcはウェルカム画面で使用され、他の画面はウェルカム画面の上にプッシュおよびポップされます。私はあなたのアプローチを使うべきだと思いますか?私はウェルカムスクリーンが一度作成されたまま残っていると思っていました。他のスクリーンは - >プッシュ - >ポップ - >割り当て解除されます。 – Cool

1

わかりやすい解決策は、ナビゲーションコントローラーにプッシュした後で、単にビューコントローラーを解放することです。

すなわち:

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 
[gvc release]; 

自動解放が実際にすべてのメモリリークを起こしていた場合、私は驚かれることだろう、と述べました。

2

あなたは安全に行うことができます:彼らは機能的に同等であり、メモリリークやクラッシュが発生することはありません

GameViewController* gvc = [[GameViewController alloc] init]; 
[self.navigationController pushViewController:gvc animated:YES]; 
[gvc release]; 

GameViewController* gvc = [[[GameViewController alloc] init] autorelease]; 
[self.navigationController pushViewController:gvc animated:YES]; 

またはこれを。 [self.navigationController pushViewController:gvc animated:YES];の後にコードを見て、gvcを過剰にリリースしたかどうかを確認してください。

+0

私は既にautoreleaseを試しました。それは 'Missed Method'と呼ばれ、クラッシュします。私はpushViewController行と同じ結果の後に[gvc release]を試しました。また、私はgvcを公開していません。私が追加したいのは、私のアプリケーションは1つのxib(MainWindow.xib)しか持っていないということです。他のものはすべてコードを使って生成されます。それのためですか?ありがとう – Cool

0

すべてである可能性があります。つまり、最初のコードが明らかに漏れていて、2番目のコードスニペットは一目瞭然ですが、そのクラス内で実装するものはわかりません。 GameViewControllerに想像して、あなたは文字列プロパティ名を持ち、かつそのにdeallocでは、あなたのようなものです:あなたは、コントローラを離すとその後の進路は

- (void)dealloc 
{ 
    [userName release]; 
    [userName release]; 
    [super dealloc]; 
} 

をクラッシュします。クラッシュした場所を正確に把握するには、gdbバックトレース(「bt」がクラッシュする場合)を使用するか、NSSombieを有効にして計測器を使用して見つけようとする方がよいでしょう。

iPhone/iPadプログラミング(リソースが不足している)の経験則として、できる限り、いつでも自動解放を避けてください。

関連する問題