【问题标题】:Unsolvable memory leak IPhone无法解决的内存泄漏 iPhone
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 你是对的,我误读了泄漏的输出。我的卡片对象泄漏了 NSMutableString,因为我忘记在 [Card dealloc] 方法中释放它。感谢大家的帮助。
【解决方案2】:

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

看看这个:Use of alloc init instead of new

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

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

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

【讨论】:

  • newalloc/init,但alloc/init 是首选方式。
  • 我的印象是执行相同的任务,但我确实进行了更改并且结果相同。
  • @michaelw2608 尝试删除代码,直到问题消失。然后慢慢重新添加代码,每次添加一小段代码时检查问题。这种方法通常可以解决各种各样的编程问题。
  • @michaelw2608 你的印象是正确的,stackoverflow.com/questions/719877/…
  • +new 没有错。 +alloc/-init 主要用于历史原因,这些原因在很多很多年里都不相关。但它们是传统的,所以它们是我们倾向于这样做的方式。自从搬到 ARC 后,由于某种原因,我发现自己使用 +new 的频率更高了(我还没弄清楚为什么;这似乎是迁移到 ARC 的一部分)。更多背景知识:stackoverflow.com/questions/948070/…
猜你喜欢
  • 2011-05-25
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多