我应该多久使用一次NSAutoreleasePools?

问题描述:

嘿,我正在做一个可可触摸静态库,并且我有这个问题:我应该多久使用一次NSAutoreleasePools?

我正在模拟器中使用Leaks工具运行我的项目,并且我正在为自动释放对象提供泄漏。

我知道一个事实,即我至少有一个NSAutoreleasePool(我的main()方法),我的问题是,我应该多长时间放置其他人(我正在为iPhone和iPad开发,如果这很重要)

更新:我已经知道,出于某种原因,我的代码没有退出iOS 4上的UIApplicationMain()调用,我只是得到SIGKILL信号,而我的autorelease池没有耗尽。我怎样才能解决这个问题(我指的是应用程序得到一个SIGKILL

感谢

+1

我在每个选择器中调用另一个线程。 – pt2ph8 2010-11-05 11:58:36

+0

在XCode中开发OSX应用程序时,控制台窗口中会填充警告信息,如果有人曾经调用过导致分配的目标c函数并且没有NSAutoreleasePool, UIKit的目标不这样做吗? – 2010-11-05 12:05:13

+0

哦,不,他们这样做,但我有一个autorelease池,所以没有在控制台的警告,只泄漏仪器... – 2010-11-05 12:16:45

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

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

+0

我有对象保留对方,这帮助我很多,谢谢! – 2010-11-06 19:57:41

从WWDC视频的标准做法认为,有很多的变数飞来飞去紧密循环是把一个好地方。在循环之前启动它,自动释放循环中的所有内容都应该到达该池,然后将其排空。

当您运行在后台线程的东西NSAutoreleasePool是必需的,所以如果你的函数可以在后台运行,那么你需要在其中创建一个自动释放池:其中NSAutoreleasePool将

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

第二种情况当你在一个循环中创建许多自动释放的对象时 - 很有用,为了避免在你周围挂着很多自动释放的对象,可以在循环迭代中创建和放弃自动释放池(就像Joe提到的那样)。

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

+0

但奇怪的是:我只在我的应用程序中使用一个线程... – 2010-11-05 12:03:48

+1

可能是你的代码错了,对象没有(自动)正确释放?通常如果没有nsautoreleasepool的问题,你会得到控制台消息“自动释放没有到位的池 - 只是泄漏” – Vladimir 2010-11-05 12:06:10

+0

没有.... – 2010-11-05 12:08:00