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

我的印象是向数组中添加一个对象会将其引用计数增加一,然后释放您刚刚添加的对象是安全的,因为在释放数组之前不会释放它,然后释放每个对象在数组中。这是对象最终应该被释放的时候。

当我添加 [tempCard release]; 它使我的应用程序崩溃,因为它无法访问内存位置,因为它已被释放。

从我读过的所有内容来看,我认为我上面所说的都是真的。如果我错了,请有人纠正我。谢谢。

4

2 回答 2

1

我在您提供的代码中看不到任何泄漏。(不过,有一些机会可以缩小它,比如将相同的操作移出条件句)。

泄漏工具的输出很难阅读。Card 对象是否有可能泄漏它的 ivars 之一?

不要泄漏,而是对您的产品运行静态分析(产品->分析)。我认为它会标记您代码的不同部分。

于 2012-04-12T00:37:02.773 回答
0

也许尝试[[Card alloc] init]代替[Card new]. 这只是一个猜测。然而,尝试 IMO 更常用的对象创建方法可能会有所帮助。

看看这个:使用 alloc init 而不是 new

您还可以尝试删除所有用于将卡片添加到数组的代码。所以你基本上有:

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

这可以帮助您找到与保留对象的数组相关的内存问题吗?

于 2012-04-11T20:51:04.573 回答