我正在构建一个iPhone应用程序,其中我分离了一些线程以在后台进行长时间运行的工作,以免挂起UI。我知道线程需要NSAutoreleasePool实例来进行内存管理。我不确定的是线程方法是否调用另一个方法-该方法是否还需要NSAutoreleasePool?
示例代码:
- (void)primaryMethod {
[self performSelectorInBackground:@selector(threadedMethod) withObject:nil];
}
- (void)threadedMethod {
NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc] init];
// Some code here
[self anotherMethod];
// Maybe more code here
[aPool drain];
}
- (void)anotherMethod {
// More code here
}
我问的原因是,我收到的错误信息是对象在没有池的情况下被自动释放,并且“只是泄漏”。
我还看到了其他问题,人们根本没有适当的自动释放池,而且我理解为什么需要自动释放池。我特别想知道在本例中在
threadedMethod
中创建的自动释放池是否适用于在anotherMethod
中创建的对象。 最佳答案
要回答您的问题,是的,anotherMethod正在使用您在threadedMethod中创建的NSAutoreleasePool,并且您在其中自动释放的所有内容都将在释放/耗尽aPool时被释放。
因此,您的错误不太可能直接源于此代码(除非发生了更多情况)。
在_NSAutoreleaseNoPool上放置一个断点(在Breakpoints窗口中按名称添加),然后在调试器中运行代码,当在没有池的情况下调用autorelease时,它将停止运行,这将解决您的问题。