1

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

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

我知道我一次至少有一个NSAutoreleasePool(以我的main()方法),我的问题是,我应该多久安装一次(如果这很重要,我正在为 iPhone 和 iPad 开发)

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

谢谢

4

3 回答 3

2

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

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

NSAutoreleasePool 有用的第二种情况是当您在循环中创建许多自动释放对象时 - 为了避免大量自动释放对象挂在您周围,您可以在循环迭代时创建和排出自动释放池(正如乔提到的那样)。

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

于 2010-11-05T12:01:40.577 回答
1

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

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

于 2010-11-05T22:33:33.430 回答
0

从 WWDC 视频标准实践中可以看出,包含大量变量的紧密循环是放置变量的好地方。在循环之前启动它,循环中自动释放的所有内容都应该进入该池,然后将其排空。

于 2010-11-05T11:58:26.770 回答