1

したがって、私のコードは次のようになります。

ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
NSLog(@"acc retain: %d", [ac retainCount]);        
[app.nav pushViewController:ac animated:NO];
NSLog(@"acc retain: %d", [ac retainCount]);        
[ac release];
NSLog(@"acc retain: %d", [ac retainCount]);    

そして私は得る:

[2649:207] acc retain: 1
[2649:207] acc retain: 3
[2649:207] acc retain: 2    

この混乱を解決する方法は?何が間違っているのかわかりません。この部分では、メモリ不足が原因でアプリケーションがクラッシュすることがあります。

編集:関連する問題。

したがって、状況は上記で定義したものと同じですが、問題はArticleControllerControllerdeallocメソッドが呼び出されないことです。

その他のコード:

- (void) navigateToNewsCategoryByIndex:(int)idx {
[app.nav popViewControllerAnimated:NO]; 

currentMode = MODE_ARTICLE;
ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
[app.nav pushViewController:ac animated:NO];
[ac release];
return ;        

}

このメソッドが数回繰り返されると、ArticleControllerControllerは大量のさまざまなインターフェイス要素を作成しますが、そのdeallocメソッドはそれらを解放しません(保持カウントがゼロになることはありません)。したがって、ここに解決しようとしているメモリクラッシュの問題があると思います。今から数日。

どうしたの?これを解決するためにもっと何かできることはありますか?

4

1 に答える 1

2

それは私にはうまく見えます。作成した後、「ac」の保持カウントは1で、これは正しいです。次に、それをapp.navにプッシュすると、さらに2つの保持がカウントされます。これは問題ありません。保持しているものをすべて解放するのは、そのクラスの責任です。最後に、作成したインスタンスを解放すると、保持カウントが2に減少します。ただし、これら2つのカウントはユーザーの責任ではありません。つまり、app.navです。

これが、別のクラスの舞台裏で何が起こっているのかわからない場合に奇妙に見える可能性があるため、retainCountの出力について実際に心配する必要がない理由です。

あなたがする必要があるのは、すべての割り当てに対して1つのリリースであり、あなたはそれを実行しました

于 2010-10-11T09:14:16.000 に答える