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

问题描述:

NSOperation在主线程中有一个委托,它调用NSOperation运行时发生的一些事件。从主线程访问NSOperation对象的安全方法?

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

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

你如何预防这种情况?我想过做的NSOperation内像这样它在后台运行:

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

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

所以可以肯定的是,我必须像这样在Main Thread的委托方法中保留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]有多余。

我现在在做NSOperation中非常类似的编码。我将操作添加到队列中,但由于我知道操作很快就会结束,因此我通过委托中的对象将所需的任何值传递回调用类。大多数情况下,如果超过1个对象,我会使用NSDictionary来执行此操作。我从来没有使用这种方法解除分配实例的问题。