无法解决的内存泄漏IPhone

时间:2012-04-11 20:44:15

标签: iphone objective-c memory-leaks

我是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发布]时;它崩溃了我的应用程序,因为它无法访问内存位置,因为它已被解除分配。

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

2 个答案:

答案 0 :(得分:1)

我没有看到您提供的代码中有任何泄漏。 (有一些机会可以减少它,但是,通过将相同的操作移出条件)。

Leaks工具输出非常难以阅读。 Card对象是否可能泄漏其中一个ivars?

而不是泄漏,在您的产品上运行静态分析(Product-&gt; Analyze)。我认为它会标记代码的不同部分。

答案 1 :(得分:0)

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

检查出来:Use of alloc init instead of new

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

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

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