我应该多久放一次NSAutoreleasePool?

时间:2010-11-05 11:56:03

标签: iphone objective-c ipad memory-leaks nsautoreleasepool

嘿,我正在制作一个可可触摸静态库,我有这个问题:

我正在使用Leaks仪器在模拟器中运行我的项目,而且我想要自动释放的对象泄漏。

我知道一个事实,即我一次至少有一个NSAutoreleasePool(在我的main()方法中),我的问题是,我应该多久放入其他人(我正在开发中)对于iPhone和iPad,如果这很重要)

更新:我已经发现,出于某种原因,我的代码没有退出iOS 4上的UIApplicationMain()调用,我只是收到SIGKILL信号,而我的自动释放池没有消耗。我该如何解决(我的意思是应用程序获得SIGKILL

由于

3 个答案:

答案 0 :(得分:2)

在后台线程中运行某些东西时需要

NSAutoreleasePool,所以如果你的函数可以在后台运行,那么你需要在它们中创建一个自动释放池:

- (void) willRunInBackground{
   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
   ...
   [pool drain];
}

NSAutoreleasePool有用的第二种情况是当你在一个循环中创建许多自动释放的对象时 - 为了避免多处自动释放的对象,你可以在循环迭代中创建和排出自动释放池(如Joe所提到的)。

但是你的内存泄漏可能是由第一个原因造成的 - 每个线程必须有自己的NSAutoreleasePool来处理自动释放的对象。

答案 1 :(得分:1)

您自动释放对象的事实本身并不能防止内存泄漏。由于您没有在控制台中看到消息告诉您对象正在池外自动释放,因此表明问题不在于它们未被放入池中。

您不能正确管理保留计数。请记住,所有对-alloc和-copy的调用必须通过调用-release或-autorelease来平衡。也许你没有在某个类的dealloc方法中释放你的成员变量。首先使用Instruments查找分配/复制对象的位置,然后查看保留的每个位置并释放它们以确保每个对象的保留计数均衡。

答案 2 :(得分:0)

从WWDC视频标准实践认为,有很多变量飞来飞去的紧凑循环是放置一个的好地方。在循环之前启动它,循环中自动释放的所有内容都应该转到该池,然后将其耗尽。