这里有一个类似的问题,它并没有准确解释我想要什么:Objective C Blocks as Async-callbacks & BAD ACCESS
我有一个 View Controller ,它调用一个带有异步回调的服务。回调是使用一个 block 完成的,该 block 引用 View Controller 上的变量来填充它们。
看起来是这样的:
- (void) loadData {
__block MyViewController *me = self;
[self.service executeWithCompletion:^(NSArray *result, NSError *error) {
if (!error) {
me.data = result;
}
}];
}
但是,如果我取消分配 View Controller ,回调将无法访问“我”。
使“我”为 NULL 的最简单方法是什么?如果我把它作为一个 iVar,它就会带回循环引用……我想?
我想我遗漏了一些明显的东西......
谢谢
最佳答案
您的目标是 iOS 5.0 或更高版本(或 Mac OS X 10.7 或更高版本)吗?如果是这样,您可以使用 ARC 和 __weak
变量(而不是 __block
变量)。当引用的对象被释放时,这将自动归零。你的代码看起来像
- (void)loadData {
__weak MyViewController *me = self;
[self.service executeWithCompletion:^(NSArray *result, NSError *error) {
if (!error) {
MyViewController *strongMe = me; // load __weak var into strong
if (strongMe) {
strongMe.data = result;
}
}
}];
}
如果您需要对旧操作系统的支持,那么您需要寻找不同的解决方案。一种解决方案是直接让 block 保留 self
。如果服务保证执行完成 block (然后释放它),这只会产生一个临时循环,当完成 block 运行时会自动中断。或者,如果您有某种方式可以取消服务(以保证取消后无法调用该 block 的方式),您可以坚持使用 __block
并确保在您的 -dealloc
。还有其他选择,但它们更复杂。
关于objective-c - block 和异步回调,dealloc 对象 - 需要 nil block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905060/