【发布时间】:2012-04-11 20:44:15
【问题描述】:
我是 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];它使我的应用程序崩溃,因为它无法访问内存位置,因为它已被释放。
从我所阅读的所有内容来看,我认为我上面所说的是真实的。如果我错了,请有人纠正我。谢谢。
【问题讨论】:
-
临时卡的声明方式和位置。另外为什么不在同一行声明它?
Card *tempCard = [[Card alloc] init];. -
如果他用的是ARC,应该是抱怨
-release的使用(而不是抱怨泄露)。 -
他切换了一些我们通常不会碰的标志,这并非完全不可能。
-
查看您的代码,您不应该遇到此错误。您可以发布
Card类的init方法吗?这是我能看到的唯一失败点。
标签: iphone objective-c memory-leaks