我是否必须不断声明弱引用以中断嵌套block的保留循环?
__weak typeof(self) weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
//do I need to create another weak reference to strongSelf for this block?
[strongSelf doSomething];
}];
}];
最佳答案
我想恐怕是的。 [strongSelf setMyBlock:<inner block>]
将导致 self
保留内部块。如果内部块对 self
有一个强引用,那就是一个循环。 strongSelf
变量最初是从 __weak
限定变量分配的,这一事实并没有什么区别。
正如其他一些用户所提到的,您可以使用原始的 weakSelf
而不是创建一个新的。在块中创建 strongSelf
引用的原因是,否则 self
可能会在块运行时被释放。 strongSelf
要么以 nil
结束(如果 self
在 strongSelf
被分配之前被释放,但这不会造成伤害)或者 self
在块执行时不会被释放,因为你有一个强引用。在您对 self
有强引用期间,原始 weakSelf
也可以安全使用,因为 self
不会被释放。
关于ios - 嵌套block的保留循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30602436/