Instruments 中的 NSAutoreleasePool 泄漏

Posted

技术标签:

【中文标题】Instruments 中的 NSAutoreleasePool 泄漏【英文标题】:NSAutoreleasePool leak in Instruments 【发布时间】:2011-11-20 22:51:46 【问题描述】:

如果之前有人问过这个问题,但我没有找到好的答案,我深表歉意。

当我运行 Instruments 时,我在代码中的这一行出现了泄漏,而不是在 main 中:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

我一直在环顾四周并在某个地方读到它可能是一个错误。有人可以帮我分享一下吗?

我确实注意到我在 main 中也有相同的名称“pool”。

【问题讨论】:

你在排空游泳池吗?就像调用“[pool drain];”当你完成了巨大的循环或后台线程? 【参考方案1】:

名字无关紧要;在整个代码库中可能有数百个名为 pool 的变量。重要的是范围。

通常,您会看到:

- someMethod

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     ... do stuff ...
     id something = [anObject retain];
     [pool drain];
     return [something autorelease];
 

即你的游泳池被抽干了吗?

drain 存在于 ios 上;参见the documentation。但是,在所有情况下,最好使用@autoreleasepool ... ;它适用于 ARC 和 MRR。)

【讨论】:

IIRC, drain 仅适用于 Mac;在 iOS 中应该是 release drain 是一个很酷的名字 :( 让我们添加一个类别来添加该方法 :D【参考方案2】:

我也遇到了这个问题,第一天学习编码的第一个问题!

我所做的只是彻底删除以以下开头的整行:

NSAutoreleasepool *pool = [[NSAutoreleasepool alloc] init];

替换为:

@autoreleasepool

然后我在程序底部删除了:

[池释放];

然后用波浪形括号关闭。

我不知道它为什么会起作用,我记得我的第一天,但​​它可以很好地运行示例书中的程序。

【讨论】:

以上是关于Instruments 中的 NSAutoreleasePool 泄漏的主要内容,如果未能解决你的问题,请参考以下文章

了解 Xcode 中的 Instruments,测试泄漏

Xcode 8.3+ 中的 Instruments 选项在哪里?

我在 UIAutomation/Instruments 中的第一个 Javascript

Instruments 中的 CoreGraphics 导致的大内存占用

通过 Instruments 中的脚本编辑器在 iPhone 应用程序中输入文本

检查 Instruments 中的内存分配