我是否必须不断声明弱引用以中断嵌套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 结束(如果 selfstrongSelf 被分配之前被释放,但这不会造成伤害)或者 self 在块执行时不会被释放,因为你有一个强引用。在您对 self 有强引用期间,原始 weakSelf 也可以安全使用,因为 self 不会被释放。

关于ios - 嵌套block的保留循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30602436/

10-09 13:10