1

我在控制台中收到此错误消息:

*** _NSAutoreleaseNoPool(): NSPathStore2 类的对象 0x10d2e0
    自动释放,没有到位池 - 只是泄漏

我无法弄清楚错误是什么?

谢谢。

4

3 回答 3

11

这是一个典型的内存管理问题,您正在自动释放一些对象而没有适当的自动释放池。自动释放不是魔法。有一个类型的对象NSAutoreleasePool可以跟踪您自动释放的所有对象并“不时”释放它们:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// An autoreleased object referenced by our pool.
id object = [NSNumber numberWithInt:1]; 
[pool drain];
// Our object no longer valid.

每个线程都必须有自己的自动释放池。这很合乎逻辑,因为线程“同时”运行,如果它们共享一个公共的自动释放池,它可能会在您仍在使用它时释放一个对象。

现在重点。每个应用程序的主线程中都有一个默认的自动释放池,这意味着您不必考虑所有这些,并且自动释放的对象可以很好地收集。但是如果你创建另一个线程,你通常也被迫为这个线程创建一个自动释放池。否则没有人声称自动释放的对象,它们只是泄漏。这正是您收到警告的原因。

没有自动释放池的泄漏线程可能如下所示:

- (void) doSomethingInBackground
{
    id object = [NSNumber numberWithInt:1];
}

- (void) someOtherMethod
{
    [self performSelectorInBackground:@selector(doSomethingInBackground);
}

修复很简单:

- (void) doSomethingInBackground
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    id object = [NSNumber numberWithInt:1];
    [pool drain];
}

现在你只需要弄清楚你在另一个线程中运行代码的位置。

于 2009-10-21T09:55:04.987 回答
2

听起来您已经在新线程上生成了一个方法(可能使用+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;

任何在自己的线程上运行的方法都需要设置一个自动释放池来捕获任何自动释放的对象:

- (void)myLovelyThreadedMethod
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ... // your code here

    [pool release];
}
于 2009-10-21T09:56:10.383 回答
1

尝试使用Clang 静态分析器

于 2009-10-21T10:02:00.330 回答