我正在构建一个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时,它将停止运行,这将解决您的问题。

10-08 14:47