从主线程访问NSOperation对象的安全方法?

时间:2011-06-05 11:57:13

标签: objective-c ios memory-management concurrency nsoperation

NSOperation在主线程中有一个委托,当NSOperation运行时会发生一些事件。

然后,代表访问NSOperation的属性以获取详细信息。

我担心这个边缘情况:如果NSOperation在调用委托后的纳秒内被队列释放了怎么办?我担心突然所有的对象都会因为-dealloc的NSOperation释放而消失,然后我在主线程上得到一个EXC_BAD_ACCESS。

你怎么防止这种情况?我想在NSOperation中做这样的事情,它在后台运行:

[(NSObject*)self.delegate performSelectorOnMainThread:@selector(operationUpdatedStatus:) withObject:[[self retain] autorelease] waitUntilDone:NO];

但我认为这是无稽之谈,因为自动释放池也会立即耗尽,因为它是NSOperation的本地。

所以可以肯定的是,我必须像这样在主线程上的委托方法中保留NSOperation吗?

- (void)operationUpdatedStatus:(NSOperation*)op {
    [op retain]; // now we're safe to use it

    NSMutableArray *errorMessages = op.errors;
    for (NSString *errorMessage in errorMessages) {
        // lots of code
    }

    [op release];
}

或者是否保证在主线程的运行循环结束之前NSOperation对象不会被杀死?

2 个答案:

答案 0 :(得分:1)

我现在正在NSOperation中进行非常类似的编码。我将操作添加到队列中,但由于我知道操作很快就会消失,我通过委托中的对象将所有需要的值传递回调用类。大多数时候,如果它超过1个对象,我会使用NSDictionary来执行此操作。我从来没有使用此方法解除分配实例的问题。

答案 1 :(得分:1)

根据the NSObject docsperformSelectorOnMainThread会保留选择器目标以及通过withObject传递的对象;直到要执行的选择器完成后才会释放。所以你的[[self retain] autorelease]是多余的。