【问题标题】:Colors in Instruments when hunting down memory leaks寻找内存泄漏时仪器中的颜色
【发布时间】:2011-02-25 19:57:55
【问题描述】:

我目前正在寻找我的 iPhone 应用程序中的内存泄漏。我正在使用 Instruments 来追踪导致泄漏的代码(越来越成为 Instruments 的朋友!)。现在 Instruments 显示两条线:一条为深蓝色(第 146 行),另一条为浅蓝色(150)。从一些试验和错误中,我知道它们以某种方式连接,但在 Objective-C 和内存管理方面还不够好,还没有真正理解如何。

有谁知道为什么要使用不同的颜色以及我的问题是什么?

我曾尝试释放 numberForArray,但应用程序在选择器视图中显示最后一行时崩溃。

感谢所有想法!

(发布这个我也意识到第 139 行是多余的!Se 那里,已经是一个改进 ;-)

【问题讨论】:

  • 始终显式初始化变量,即使您的语言为您执行此操作。当您在语言之间切换或其他人查看您的代码或在您的代码周围放置循环时,它会变得混乱。绝对没有性能损失,因为现代编译器只会在冗余时将其删除。
  • @colithium 我不同意这个建议,但我不明白它如何适用于这个问题。代码显示中唯一的变量声明在第 140 行,并且确实包括初始化...
  • “发布这个我也意识到第 139 行是多余的!Se 那里,已经是一个改进”我认为这就是他在问题中这行的意思。
  • 好的,我明白你的意思了。在这种情况下,我认为这不是“语言为你做”的情况,因为 OP 意识到变量总是在使用之前在 for 循环中分配,所以在进入循环之前将其设置为 0 是多余的.

标签: objective-c xcode memory-leaks instruments


【解决方案1】:

好的,让我们看看这段代码的对象分配/所有权行为...

numberForArray 被分配了-NSString stringWithFormat: 的结果,这是一个自动释放的对象。这意味着您确实不想发布它(正如您所发现的那样)。

然后将该对象添加到glucoseLoader NSMutableArray,这将retain 它。您循环 100 次,创建 100 个对象并将它们添加到 glucoseLoader。当glucoseLoader被释放时,在第154行,它也会释放所有添加到它的对象。

但等等,还有更多:firstComponentRange 是从 glucoseLoader 使用 -NSArray initWithArray: 创建的。当您这样做时,源数组的所有元素都将添加到目标,目标将再次保留它们。

那么,您何时/如何发布firstComponentRange?

【讨论】:

  • 感谢大卫提供的信息丰富且正确的答案。我为此发疯了一段时间,错过了(忘记)关于自动释放的事情。我在选择器中使用 firstComponentRange,所以现在我在 viewWillDisappear 中释放该数组。再次感谢!
【解决方案2】:

Instruments 告诉您 firstComponentRange 没有被释放(一个小泄漏)。由于数组保留了它的内容,因此您也吃了 100 个 NSString 实例,分配在用较暗带指示的行处(更严重的泄漏)。

【讨论】:

  • 嗨,巴里,谢谢。我是这样思考的,不幸的是,这导致我以错误的顺序看待问题。正如您在我对 David 的回复中看到的那样,真正的问题在于我的 firstComponentRange。我现在没有泄漏:-) 但我想就是这样。你边做边学...
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 2011-12-06
  • 2011-02-15
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多