2012-04-11 36 views
1

私はIPhoneプログラミングを初めて勉強しています。次のメモリリークの解決には苦労します。私は、配列がリリースされるまで、それは割り当て解除されないので、配列にオブジェクトを追加すると、あなたが追加したオブジェクトを解放しても安全だろう、いずれかによって、参照カウントを増加させるという印象の下にあった解決できないメモリリークIPhone

while(numDeckCounter < numDecks){ 
    int cardCounter=1; 
    for (int i =1; i<=52; i++) { 
     tempCard = [Card new]; //leaks tool says that this is leaking object 
     if(i>=1 && i<=13) 
     { 
      tempCard.suit = CLUBS; 
      tempCard.faceValue = cardCounter; 
      [deckArr addObject:tempCard]; //reference count 2 
      cardCounter++; 
     } 
     else if(i>=14 && i<=26) 
     { 
      tempCard.suit = DIAMONDS; 
      tempCard.faceValue = cardCounter; 
      [deckArr addObject:tempCard]; 
      cardCounter++; 
     } 
     else if(i>=27 && i<=39) 
     { 
      tempCard.suit = HEARTS; 
      tempCard.faceValue = cardCounter; 
      [deckArr addObject:tempCard]; 
      cardCounter++; 
     } 
     else 
     { 
      tempCard.suit = SPADES; 
      tempCard.faceValue = cardCounter; 
      [deckArr addObject:tempCard]; 
      cardCounter++; 
     } 
     if(cardCounter ==14){ 
      cardCounter=1; 
     } 
     [tempCard release]; //this causes an EXC_BAD_ACCESS -reference count should be 1 
    } 
    numDeckCounter++; 
} 

突き合わせると、配列内の各オブジェクトが解放されます。これは、オブジェクトの最終的な割り当てを解除するときです。

[tempCard release]を追加すると、私はそれがすでに割り当て解除されているので、メモリ位置にアクセスすることができないので、私のアプリをクラッシュさせます。

私が読んだことのすべてから、上記のことが真実だと思います。私が間違っていると誰かが私を修正してください。ありがとう。

+3

どのようにテンポラリカードが宣言されていますか?同じ行に宣言してみませんか? 'Card * tempCard = [[カード割り当て] init];'。 – Joe

+0

ARCを使用していますか? – larsacus

+1

もし彼がARCを使っていたら、 '-release'の使用について不平を言わなければなりません。 – Wevah

答えて

1

あなたが提示したコードに漏れはありません。 (しかし、それをスリム化する機会がいくつかありますが、同じ操作を条件文から外すことによって)

リークツールの出力は読みにくいです。カードオブジェクトがイヴァールの1つを漏らしている可能性はありますか?

リークの代わりに、製品で静的解析を実行します(製品 - >分析)。私はあなたのコードの別の部分にフラグを立てると思います。

+0

あなたが正しいです、私は漏れの出力を誤解しました。私のカードオブジェクトは、[Card dealloc]メソッドでリリースするのを忘れてしまったので、NSMutableStringが漏れていました。みんな助けてくれてありがとう。 –

0

おそらく、[Card new]の代わりに[[Card alloc] init]を試してください。これは単なる推測です。しかし、IMOをより一般的なオブジェクト作成の方法を試すことは役に立ちます。

はこれをチェックしてください:Use of alloc init instead of new

をあなたはまた、配列にカードを追加するためのすべてのコードを削除してみてください。だから、基本的に持っていると思います:

card = [Card new]; 
[card release]; 

これはあなたがおそらくオブジェクトを保持配列/ wの関連するメモリの問題を見つけるのを助けることができますか?

+1

'new'は' alloc/init'ですが、 'alloc/init'がそれを行うための好ましい方法です。 – Joe

+0

私は同じ仕事をした印象を受けていましたが、私は変更を加えましたが、同じ結果がありました。 –

+0

@ michaelw2608問題がなくなるまでコードを削除してください。その後、小さなコードを追加するたびに、コードをゆっくりと再追加し、問題を確認します。このアプローチは、通常、さまざまなプログラミング問題を解決します。 – SundayMonday

関連する問題