NSAutorelease内存泄漏(NSAutorelease memory leak)

2019-08-22 23:01发布

我得到在控制台此错误信息:

*** _NSAutoreleaseNoPool(): Object 0x10d2e0 of class NSPathStore2
    autoreleased with no pool in place - just leaking

我想不出有什么错误?

谢谢。

Answer 1:

这是一个典型的内存管理的问题,你是自动释放一些对象,而无需到位自动释放池。 自动释放是不是魔术。 有类型的对象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];
}

现在,你只需要找出你在另一个线程中运行的代码。



Answer 2:

这听起来像你已经产生了推上了一个新的线程的方法(可能使用+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;

是在自己的线程运行的任何方法,都需要有一个自动释放池设置了捕捉任何自动释放的对象:

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

    ... // your code here

    [pool release];
}


Answer 3:

尝试使用锵静态分析器



文章来源: NSAutorelease memory leak