我是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发布]时;它崩溃了我的应用程序,因为它无法访问内存位置,因为它已被解除分配。
从我读过的所有内容来看,我认为上面所说的是真的。如果我错了,请有人纠正我。感谢。
答案 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];
这可以帮助您找到与阵列保留对象相关的内存问题吗?