为什么必须在 block 内对弱引用进行强引用?
我知道在 block 中使用弱引用可以避免循环引用。但是为什么又要有强引用弱引用呢?
背景:
正如 Mason 所述,这是最佳实践。
I know the proper way to refer to self inside a block is to create a weak reference outside the block, and then a strong reference to that weak reference inside the block[...]
示例:
__weak typeof(self) weakSelf = self;
void (^someBlock)(id) = ^(id data){
typeof(self) strongSelf = weakSelf;
// code using strongSelf
});
最佳答案
想象一下,最后剩下的对 self 的强引用保存在与您的 block 运行所在的线程不同的线程上。
现在发生这种情况:
__weak typeof(self) weakSelf = self;
void (^someBlock)(id) = ^(id data){
if (weakSelf != nil) {
// last remaining strong reference released by another thread.
// weakSelf is now set to nil.
[myArray addObject:weakSelf];
}
});
这将因向数组添加 nil 时出现 NSInvalidArgument 异常而崩溃。
在使用之前使引用变强可以消除潜在的竞争条件并确保指针始终指向同一个对象。
如果您 100% 确定一个对象只会被一个线程引用,那么就没有必要这样做。但做出这种假设是不好的做法。
关于ios - 对 block 内弱引用的强引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23806751/