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

标签 objective-c ios memory-management concurrency nsoperation

NSOperation 在主线程中有一个委托(delegate),它在 NSOperation 运行时发生的一些事件被调用。

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

我担心这种边缘情况:如果 NSOperation 在调用委托(delegate)后一纳秒被队列释放怎么办?由于 NSOperation 的 -release in -dealloc,我担心突然间所有对象都可能消失,然后我在主线程上得到一个 EXC_BAD_ACCESS。

如何防止这种情况发生?我考虑过在后台运行的 NSOperation 中做这样的事情:

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

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

那么可以肯定的是,我必须像这样在主线程的委托(delegate)方法中保留 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] 是多余的。

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

相关文章:

iOS - TableView willDisplayCell 动画仅在用户向下滚动而不是顶部时发生

ios - 不使用 ARC 时替换 __weak

c++ - 有效地将多个一维数组中的数据收集到单个一维数组中

iphone - 为引用的子项目选择构建配置

iOS7 键盘返回/完成/搜索色调颜色

iphone - 如何使用 UIKit/Quartz 在 iPhone 上的纹理上绘制灯光效果

ios - iOS 模拟器中存在头文件,但 iOS 设备上不存在...?

ios - 突出显示 uitextview 显示 inputAccessoryView

windows - 检查 VirtualFreeEx 是否已经完成/执行

algorithm - "2D memory management"的高效算法