NSOperation在主线程中有一个委托,该委托在NSOperation运行时发生的某些事件上被调用。

委托然后访问NSOperation的属性以获取详细信息。

我担心这种极端情况:如果NSOperation在调用委托后的一纳秒内被队列释放,该怎么办?我担心突然所有对象都会由于NSOperation的-dealloc中的-release而消失,然后我在主线程上得到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对象不会被杀死?

最佳答案

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

关于objective-c - 从主线程访问NSOperation对象的安全方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6242747/

10-12 22:31