从主线程访问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 docs,performSelectorOnMainThread
保留选择器目标以及通过withObject
传递的对象;直到要执行的选择器完成后才会释放。所以你的[[self retain] autorelease]
有多余。
答
我现在在做NSOperation中非常类似的编码。我将操作添加到队列中,但由于我知道操作很快就会结束,因此我通过委托中的对象将所需的任何值传递回调用类。大多数情况下,如果超过1个对象,我会使用NSDictionary来执行此操作。我从来没有使用这种方法解除分配实例的问题。