【问题标题】:Understanding profiling and memory leak了解分析和内存泄漏
【发布时间】:2023-03-24 15:55:02
【问题描述】:

Xcode 中使用ProfileLeaks tool,我正在寻找我的代码中的漏洞。 我打开call Tree,然后检查我在那里看到的功能。

Xcode 将带您进入代码并为线条着色。有时它用红色着色,这当然是泄漏,但有时,它用浅棕色着色,并且在线附近有一个数字:20.5%

我想了解这个数字的含义,以及颜色的含义?

我在这行代码上得到了这条棕色线:

textL=[[UILabel alloc] initWithFrame:CGRectMake(A+B+C,A,view.frame.size.width-A-B-C-A, B)];

这显然不是泄漏,但是,这行代码是 for 循环的一部分,被创建了 100 多次,以添加到 scrollview 的单元格中。有什么我也必须在这里改变的吗?

编辑:

我有这个类是 UIView 的子类,这个类对标签和 imageViews(@properties) 有很强的引用。稍后我将创建此类的许多实例作为添加到 scrollvoiew 的视图,并将它们保存到数组中。这可能是问题吗?我在那个类中有很强的引用吗?

谢谢。

【问题讨论】:

标签: ios objective-c xcode memory-leaks


【解决方案1】:

红线表示内存泄漏最多的地方,棕色线表示内存泄漏但不是很大。百分比显示该方法中有多少内存泄漏(存在所有内存泄漏)

当你运行 Leaks 测试时,你会看到类似这样的东西 -

当您选择泄漏时,您会随着时间的推移看到所有泄漏,例如(那些读取行)
- 您可以在右侧显示“扩展详细信息”视图。它将显示所选内存泄漏的调用树。
在我的示例中,它指出我在“[CardGameViewController viewDidLoad]”中泄漏

在调用树视图中,百分比显示所有内存中有多少是通过该方法泄漏的。您可以在调用树的许多地方泄漏内存。它可以帮助您找到内存泄漏最大的地方并首先修复它。
这个百分比对于性能优化非常有用。

【讨论】:

    【解决方案2】:

    您说分配UILabel 的那行“显然不是泄漏”。它可能不是泄漏的来源,但它是后来泄漏的对象的分配。

    当 Instruments 通知您泄漏时,它不会通知您导致泄漏的违规代码行(因为它无法知道),而只是向您显示泄漏对象的原始位置已分配。

    因此,它突出显示这行代码的事实表明该项目正在泄漏(例如,可能具有这行代码的视图控制器由于强引用循环而泄漏,从而导致任何对象它维护强引用,例如这个标签,也会泄漏)。泄漏还涉及其他对象这一事实进一步证明,这个UILabel只占泄漏的20.5%。

    【讨论】:

    • 谢谢,你能检查我的编辑,看看你能不能帮助我理解它可能是什么?
    • @Curnelious 不幸的是,这里不足以诊断问题,但我建议您首先关注您的 UIView 子类。这是否被正确释放?在您确认之前,没有必要担心其属性是否被正确释放。我敢打赌这个UIView 子类(或者,更有可能是它的视图控制器)没有被正确地释放(可能是由于一些保留周期)。从上到下开始。
    • @Curnelious 我可能会建议观看 WWDC 2013 视频,Fixing Memory Issues,以更深入地了解跟踪内存问题。