1

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++;
}

配列にオブジェクトを追加すると、その参照カウントが 1 つ増えるという印象を受けました。その後、追加したばかりのオブジェクトを解放しても安全です。なぜなら、配列がバンピングを解放されてから各オブジェクトが解放されるまで割り当てが解除されないからです。配列で。これは、オブジェクトの割り当てを最終的に解除する必要があるときです。

[tempCard リリース] を追加すると、次のようになります。既に割り当てが解除されているため、メモリの場所にアクセスできないため、アプリがクラッシュします。

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

4

2 に答える 2

1

提示されたコードにリークは見られません。(ただし、同じ操作を条件から移動するなどして、スリム化する機会がいくつかあります)。

Leaks ツールの出力は非常に読みにくいものです。Card オブジェクトが ivar の 1 つをリークしている可能性はありますか?

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

于 2012-04-12T00:37:02.773 に答える
0

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

これをチェックしてください:new の代わりに alloc init を使用する

カードを配列に追加するためのすべてのコードを削除することもできます。したがって、基本的には次のようになります。

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

これは、おそらくオブジェクトを保持する配列に関連するメモリの問題を見つけるのに役立ちますか?

于 2012-04-11T20:51:04.573 に答える