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

时间:2012-02-28 03:55:29

标签: objective-c memory-leaks 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]的描述。两种方法都是一样的。

我对自动释放池文档的理解是我应该为与主线程分开的后台线程设置一个。这就是我想要的方式,但显然这不是正确的方法吗?

我做了一些根本错误的事吗?我该怎么做才能满足记录的要求?

2 个答案:

答案 0 :(得分:0)

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

实际上,没有足够的信息可以说明任何具体内容。

无论如何,你可能会过度释放某些东西。打开僵尸,看看是否有帮助。

答案 1 :(得分:0)

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

HERE是关于它的主题。

我认为导致崩溃的主要原因是[opPool release];。您是否尝试过[opPool drain];而不是[opPool release];


编辑:

您似乎宣布自己的opPool为iVar,所以您是否已在dealloc发布了它?如果是这样,那么你会得到两个release并因此而崩溃。

也许你可以尝试类似的东西:

...
NSAutoreleasePool * opPool = [[NSAutoreleasePool alloc] init];

[self start];
[self finish];

[opPool drain];
...