我有一个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];
...