NSAutoReleasePool 泄漏

Posted

技术标签:

【中文标题】NSAutoReleasePool 泄漏【英文标题】:NSAutoReleasePool Leaking 【发布时间】:2011-01-04 18:38:59 【问题描述】:

谁能告诉我为什么 NSAutoreleasePool 在这段代码中泄漏。我正在使用仪器来检查泄漏并且此代码以某种方式泄漏。谁能引导我走向正确的方向。我在其他地方有完全相同的代码并且运行良好。

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:self.url];
 [request setDelegate:self];

 NSOperationQueue *queue = self.downloadQueue;
 [queue addOperation:request];
 [request release];

【问题讨论】:

如果在[request release]之后添加[queue release],泄漏是否仍然存在? 【参考方案1】:

如果您围绕该代码创建 NSAutoreleasePool,它应该会消失。如果这段代码没有在主线程上运行,通常会发生这种情况。

NSAutoreleasePool* pool = [NSAutoreleasePool new];
// Your code goes here
[pool drain];

另外,请注意,如果您在 NSAutoreleasePool new/drain 块内循环,您将出现泄漏,直到您遇到排水管。这样做的结果是,如果您在循环内分配了太多内存,您的应用程序仍然会耗尽内存。在这种情况下,您可能需要在每次循环中创建并排出第二个 NSAutoreleasePool(或者可能每第 n 次通过循环以避免一些开销)。

【讨论】:

+1 表示马克的评论。我经常在线程条目上看到创建自动释放池并且在线程退出之前不会耗尽它的代码。对于一个长期存在的线程,甚至是一个分配大量内存(例如图像)的短线程,您需要经常排空并重新创建池。【参考方案2】:

您是否在辅助线程上运行此代码?如果是这样,您是否在进入时设置了自动释放池?

【讨论】:

没有一切都在主线程上我正在使用 NSOperationQueue 进行多线程处理,我相信它会处理 NSAutorelease 池本身。如果我直接在其他线程上使用 NSThread,那么我必须创建一个自动释放该特定线程的池..对..?如果我错了,请纠正我.. 你可以尝试在这个函数上包裹一个 NSAutoreleasePool 看看它是否能解决问题。当您尝试在后台执行没有 AutoreleasePool 的方法时,通常会发生 AutoreleasePool-leak 是的,您必须在您的操作主中创建一个自动释放池。见***.com/questions/184409/…

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

Instruments 中的 NSAutoreleasePool 泄漏

我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?

NSAutoreleasePool 问题

Objective-c 中 NSAutoreleasePool 中的对象

MKMapView 从 main.m 中的 autorealease 泄漏

NSAutoreleasePool 和 @autoreleasepool 块有啥区别?