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对象不会被杀死?
答案 0 :(得分:1)
我现在正在NSOperation中进行非常类似的编码。我将操作添加到队列中,但由于我知道操作很快就会消失,我通过委托中的对象将所有需要的值传递回调用类。大多数时候,如果它超过1个对象,我会使用NSDictionary来执行此操作。我从来没有使用此方法解除分配实例的问题。
答案 1 :(得分:1)
根据the NSObject docs,performSelectorOnMainThread
会保留选择器目标以及通过withObject
传递的对象;直到要执行的选择器完成后才会释放。所以你的[[self retain] autorelease]
是多余的。