Iphone 无法解决的内存泄漏

Iphone 无法解决的内存泄漏,iphone,objective-c,memory-leaks,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)

我是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++;
}
while(numDeckCounter对于(int i=1;i=1&&i=14&&i=27&&i也许可以尝试
[[Card alloc]init]
而不是
[Card new]
。这只是一个猜测。但是尝试IMO更常见的对象创建方法可能会有所帮助

看看这个:

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

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

这可能会帮助您找到与保留对象的数组相关的内存问题,可能是?

可能尝试
[[Card alloc]init]
而不是
[Card new]
。这只是一个猜测。但是,尝试更常见的对象创建方法可能会有所帮助

看看这个:

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

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

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

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

Leaks工具的输出很难读取。是否可能Card对象正在泄漏其IVAR之一


在产品上运行静态分析(product->Analyze)而不是泄漏。我认为它将标记代码的不同部分。

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

Leaks工具的输出很难读取。是否可能Card对象正在泄漏其IVAR之一



在产品上运行静态分析(产品->分析),而不是泄漏。我想它会标记代码的不同部分。

new
alloc/init
,但
alloc/init
是首选的方法。我觉得我执行了相同的任务,但我确实做了更改,结果也一样。@michaelw2608尝试删除代码,直到问题消失。然后慢慢来每次添加一小段代码时,请重新添加代码并检查问题。这种方法通常可以解决各种各样的编程问题。@michaelw2608您的印象是正确的,+new没有任何问题。+alloc/-init的使用主要是出于历史原因,而这些原因在很多很多年里都不相关。但它们是传统的这就是我们倾向于这样做的原因。自从移动到ARC后,我发现自己出于某种原因更频繁地使用+new(我还不知道为什么;它只是作为移动到ARC的一部分似乎很自然)。关于更多的背景:
new
alloc/init
,但是
alloc/init
是首选的方法。我的印象是,我执行了相同的任务,但我确实做了更改,并且它们得到了相同的结果。@michaelw2608尝试删除代码,直到问题消失。然后慢慢地重新添加代码并重试每次添加一小段代码时,都要检查这个问题。这种方法通常可以解决各种各样的编程问题。@michaelw2608您的印象是正确的,+new没有错。+alloc/-init的使用主要是出于历史原因,已经很多很多年没有相关的原因了。但是它们是传统的,所以我们就是这样使用的d去做。自从移动到ARC后,我发现自己出于某种原因(我还不知道为什么;它只是作为移动到ARC的一部分似乎很自然)更频繁地使用+new。更多的背景:临时卡是如何声明的,在哪里声明的。为什么不在同一行声明它呢?
card*tempCard=[[card alloc]init];
。如果他使用的是ARC,它应该抱怨使用了
-释放
(而不是抱怨泄漏)。他切换了一些我们都不常碰的标志并非完全不可能。看看你的代码,你不应该有这个错误。你能发布你的
Card
类的
init
方法吗?这是我能看到的唯一失败点。临时卡是如何声明的,在哪里声明的。为什么不在同一行声明它呢?
Card*tempCard=[[Card alloc]init];
。如果他使用的是ARC,它应该抱怨使用了
-release
(而不是抱怨泄漏)。他切换了一些我们都不常碰的标志并非完全不可能。看看你的代码,你不应该有这个错误。你能发布你的
Card
类的
init
方法吗。这是我能看到的唯一失败点。你是对的,我误读了泄漏的输出。我的卡对象泄漏了一个NSMutableString,因为我忘了在[Card dealloc]方法中释放它。谢谢大家的帮助。你是对的,我误读了泄漏的输出。我的卡对象正在泄漏NSMutableString,因为我忘了在[Card dealloc]方法中释放它。谢谢大家的帮助。