Iphone 我应该多久设置一次NSAutoReleasePool?

Iphone 我应该多久设置一次NSAutoReleasePool?,iphone,objective-c,ipad,memory-leaks,nsautoreleasepool,Iphone,Objective C,Ipad,Memory Leaks,Nsautoreleasepool,嘿,我正在制作一个cocoa touch静态库,我有一个问题: 我正在用Leaks工具在模拟器中运行我的项目,我正在为自动释放的对象找出漏洞 我知道我一次至少有一个NSAutoreleasePool(在我的main()方法中),我的问题是,我应该多久加入一次其他人(如果有必要的话,我正在为iPhone和iPad开发) 更新:我发现,出于某种原因,我的代码没有退出iOS 4上的UIApplicationMain()调用,我只是收到了一个SIGKILL信号,我的自动释放池没有耗尽。我如何解决这个问题

嘿,我正在制作一个cocoa touch静态库,我有一个问题:

我正在用Leaks工具在模拟器中运行我的项目,我正在为自动释放的对象找出漏洞

我知道我一次至少有一个
NSAutoreleasePool
(在我的
main()
方法中),我的问题是,我应该多久加入一次其他人(如果有必要的话,我正在为iPhone和iPad开发)

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


感谢来自WWDC视频的标准实践认为,有很多变量的紧密循环是放置一个变量的好地方。在循环之前启动它,循环中自动释放的所有内容都应该进入该池,然后将其排空。

NSAutoreleasePool
在后台线程中运行时是必需的,因此如果可以在后台运行函数,则需要在其中创建自动释放池:

- (void) willRunInBackground{
   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
   ...
   [pool drain];
}
NSAutoreleasePool有用的第二种情况是,当您在一个循环中创建许多自动释放对象时-为了避免有太多的自动释放对象挂在周围,您可以在循环迭代中创建并耗尽自动释放池(正如Joe提到的)


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

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


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

我在另一个线程中调用的每个选择器中都这样做。在XCode中开发OSX应用程序时,如果调用导致分配的objective c函数并且没有NSAutoreleasePool,控制台窗口将充满警告。UIKit目标不这样做吗?哦,不,他们这样做了,但我有一个自动释放池,所以控制台中没有警告,只有仪器泄漏…有关SIGKILL的信息,请参阅。可能是您的代码错误,对象没有(自动)正确释放?通常,如果没有nsautoreleasepool出现问题,您会收到控制台消息“autoreleased没有池在适当位置-只是泄漏”,然后检查您的代码-可能是内存管理错误吗?试着用静态分析器(build&analyze选项)来构建你的项目——它可能会指向有问题的代码。我一直在使用它,因为我已经很久没有使用objective-c了,我已经修复了所有这些东西。。。。如果你帮不上忙,没关系,我只是想你也许能帮上忙。。。我会继续努力的。。哦,在我的应用程序中,它永远不会到达我在
main()
方法中返回整数的位置。。。我要检查一下,我有很多东西可以互相保留,这对我很有帮助,谢谢!