在次线程上的NSOperation中使用NSAutoReleasePool(启动和完成方法):崩溃



我有一个NSOperation,我想用一个NSAutoreleasePool括起来,如下所示:

- (void) start {
    opPool = [[NSAutoreleasePool alloc] init];
    if (self.isCancelled) {
        [self finish];
    }
    ''' more code ...   
}

- (void) finish {
    [opPool release];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:nil];
    ... more finish code here ...
    self.state = LSOperationStateFinished;
}

opPool是一个iVar。

该操作在没有NSAutoreleasePool分配和释放的情况下工作。但它在实现时崩溃了,如图所示。

我在两个方法中都放了一个断点,看看[NSThread currentThread]的描述是什么。两个方法内部都是一样的。

我从关于自动发布池的文档中了解到,我应该为独立于主线程的后台线程设置一个池。这就是我想做的,但显然这不是正确的方式?

我是不是做错了什么?我应该做些什么来满足文档化的要求?

如果发生崩溃,请发布回溯。

事实上,没有足够的信息来说明任何具体的事情。

在任何情况下,你都有可能过度释放一些东西。打开僵尸,看看这是否有帮助。

您可以将自己的NSAutoreleasePool插入到主线程中,这没关系。

这里有一条线索。

我认为造成您崩溃的主要原因是[opPool release];。你试过[opPool drain];而不是[opPool release];吗?


编辑:

似乎您已将您的opPool声明为iVar,那么您在dealloc中发布了它吗?如果是这样的话,那么您得到了两个release并因此崩溃。

也许你可以试试这样的东西:

...
NSAutoreleasePool * opPool = [[NSAutoreleasePool alloc] init];
[self start];
[self finish];
[opPool drain];
...

相关内容

  • 没有找到相关文章

最新更新