我正在听斯坦福大学的iOS开发讲座,我有一个计算器大脑的课程,它已经在控制器中被alloc init了,但我还没有在dealloc中released它。
- (CalculatorBrain *)brain
{
if (!brain)
brain = [[CalculatorBrain alloc] init];
return brain;
}我从XCode -> Run with Performance Tool运行,应用程序启动时没有泄漏,然后我在iOS模拟器中单击主页按钮,但什么也没有,然后双击主页按钮,关闭应用程序,但仍然什么也没有。
我也做了构建和分析,它没有发现任何东西
你能让我知道为什么它不去取吗?
发布于 2011-07-24 16:56:38
看起来好像没有检测到泄漏。看这一行:
brain = [[CalculatorBrain alloc] init];只要brain指向一个对象,该对象就不会被认为是“内存泄漏”。如果你在某一时刻这么做,
brain = nil;然后泄漏就会被记录下来。释放容器对象也可以做到这一点,但是你确定它正在被释放吗?(例如,当您的程序退出时,它不会被释放。)
问题:泄漏检测器无法检测到所有内存泄漏--这是一个经过数学验证的事实。大多数检测器只检测无法到达的对象,并且许多泄漏检测器特别容易出现假阴性--在C中,很难在运行时区分指针和整数。
编辑:听起来你的应用程序只创建了控制器的一个实例,它只创建了CalculatorBrain的一个实例。如果您考虑内存泄漏的真正含义,您可以将其定义为程序不会释放回操作系统的未使用内存。
CalculatorBrain总是在使用中,因此它不是泄漏。如果你想创建一个漏洞来看看它是什么样子,你可以在你的程序运行时多次创建一个新的CalculatorBrain,但是忘记释放未使用的版本。在这种情况下,随着程序的运行,会累积越来越多的CalculatorBrain实例。在iOS和其他嵌入式系统上,这通常会使程序崩溃。在现代的64位计算机上,它会逐渐填满可用的交换空间,直到您耗尽交换空间、地址空间或其他一些资源--导致程序崩溃或使系统完全没有响应能力。
标准的做法是不关心释放本应在整个程序运行期间存在的对象。
发布于 2011-07-24 20:52:55
分析器无法找到所有内存泄漏。就它而言,将实例存储到ivar中不会从该方法中泄漏它,然后在dealloc中它不会意识到应该释放ivar。我不记得了(我自己仍然在使用XCode 3),XCode 4可能在这方面有所改进。
至于性能工具,请记住,一个对象不会被认为是泄漏的,直到没有任何东西再持有对它的引用。因此,即使你的控制器没有解除大脑的分配,在控制器解除分配(或接受大脑移植)之前,大脑不会被认为是泄露的。此外,请注意,在*nix类系统上,内存分配会在进程退出时自动清除。因此,如果您为应该在您的进程的生命周期中存在的对象(例如,应用程序委托和它永久持有的任何对象)分配内存,并依赖此行为在进程退出时释放它,那么这并不是真正的泄漏。
发布于 2011-07-24 21:10:31
好吧..。确实,泄漏不能检测到所有的内存泄漏,但假设您正在这样做:
myIvarBrain=[self brain];如果你将它提供给一个iVar (在你的类的dealloc中释放,没有访问器),实际上根本没有泄漏。返回的RC是1,而且它将是你的类释放后的1。如果您没有在dealloc中释放它,那么您应该等待类的dealloc,以查看内存泄漏。说得通吗?
https://stackoverflow.com/questions/6781190
复制相似问题