gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:22:30 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com