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 8.3+ 中的 Instruments 选项在哪里?
我在 UIAutomation/Instruments 中的第一个 Javascript
Instruments 中的 CoreGraphics 导致的大内存占用