[英]XCode/Instruments not showing memory leaks
我正在关注斯坦福 iOS 开发讲座,我有一个计算器大脑 class,它已经在dealloc
中进行了分配alloc init
,但我还没有在交易中release
它。
- (CalculatorBrain *)brain
{
if (!brain)
brain = [[CalculatorBrain alloc] init];
return brain;
}
我从 XCode 运行 -> 使用性能工具运行,应用程序启动并且没有出现泄漏,然后我单击 iOS 模拟器中的主页按钮,什么也没有,然后我双击主页按钮并关闭应用程序,仍然没有。
我也做了构建和分析,它没有发现任何东西
你能告诉我为什么它不捡起来吗?
似乎没有可检测到的泄漏。 看看这一行:
brain = [[CalculatorBrain alloc] init];
只要brain
指向 object,object 就不会被视为“内存泄漏”。 如果你在某个时候这样做,
brain = nil;
然后泄漏将注册。 释放容器 object 也可以实现这一点,但您确定它正在被释放吗? (例如,当您的程序退出时,它不会被释放。)
问题:泄漏检测器无法检测到所有 memory 泄漏——这是经过数学证明的事实。 大多数检测器只检测无法到达的对象,而许多泄漏检测器特别容易出现误报——在 C 中,在运行时很难区分指针和 integer 之间的区别。
编辑:听起来您的应用程序只创建了一个 controller 实例,它只创建了一个CalculatorBrain
实例。 如果您考虑真正的 memory 泄漏是什么,您可以将其定义为您的程序不会释放回操作系统的未使用的 memory。
CalculatorBrain
一直在使用,因此它不是泄漏。 如果你想创建一个泄漏来查看它的样子,你可以在程序运行时多次创建一个新的CalculatorBrain
,但忘记释放未使用的版本。 在这种情况下,随着您的程序运行,越来越多的CalculatorBrain
实例会累积。 在 iOS 和其他嵌入式系统上,这通常会使您的程序崩溃。 在现代 64 位计算机上,它会逐渐填满可用的交换空间,直到您用完交换空间、地址空间或其他一些资源——导致程序崩溃或使系统非常无响应。
标准做法是不关心释放整个程序运行时应该存在的对象。
分析仪无法找到所有 memory 泄漏。 就它而言,将实例存储到 ivar 中不会从该方法中泄漏它,然后在 dealloc 中它没有意识到应该释放 ivar。 XCode 4 可能在这方面有所改进,我不记得了(我自己仍然使用 XCode 3)。
至于性能工具,请记住 object 不会被视为已泄露,除非不再有对其的引用。 因此,即使您的 controller 没有释放大脑,在 controller 被释放(或接受脑移植)之前,大脑也不会被视为泄漏。 另外,请注意在 *nix-like 系统上,memory 分配会在进程退出时自动清理。 因此,如果您将 memory 分配给在进程生命周期内应该存在的对象(例如应用程序委托及其永久保留的任何内容)并依靠此行为在进程退出时释放它,这并不是真正的泄漏。
嗯...确实泄漏无法检测到所有 memory 泄漏,但是假设您正在这样做:
myIvarBrain=[self brain];
如果您将它提供给 iVar(在 class 的 dealloc 中发布,并且没有访问器),实际上根本没有泄漏。 返回的 RC 为 1,自从您的 class 释放后,它将为 1。 如果您不在 dealloc 中释放它,您应该等待 class 的 dealloc 以查看 memory 泄漏。 有意义吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.