0

私はこのような別のループの中に入れたゲームループを持っています:

 for (int i = 1; i <= 10000; i++)
 {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Game *game = [[Game alloc] init];
    while ([game isActive])
       [game nextRound];
    [game release];

    [pool release]; 
 }

しかし、Activity Monitorで、使用される実際のメモリが無期限に増加し、約1GBのメモリに達するとアプリが最終的にクラッシュすることに気付きました。機器はリークを報告しませんでした。clangstaticanalyzerはリークも報告しませんでした。

私の質問は次のとおりです。

  1. 機器は常にすべてのメモリリークを検出しますか?
  2. このメモリの無期限の増加には別の理由がありますか?

編集:

@Phillipsが指摘したように、その理由はゾンビの旗でした!オフにした後、メモリフットプリントは期待どおりです。

4

2 に答える 2

2

そこには大きなwhileループがあり、内部に自動解放プールはありません。試す

while ([game isActive]) {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [game nextRound];
   [pool release];
}
于 2012-11-02T20:24:53.070 に答える
2

計測器を使用して、メモリ割り当てを確認することもできます。記憶が大きくなったときに生きているオブジェクトの数を調べて、どのようなものがまだアクティブであるかを確認してください。

必ずしもメモリが増大する原因となるリークではありません。たとえば、オブジェクトnextRoundを保持するGameオブジェクトを作成した場合、投稿したコードでオブジェクトをリリースしても、が得られない可能性がありますdealloc

于 2012-11-02T20:29:42.757 に答える