保留块内部块的循环

Retain Cycles for Blocks Inside of Blocks

我是否必须连续声明弱引用以打破块内块的保留周期?

__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 被分配之前被释放,但这不会造成伤害)否则 selfnot 在块执行时被释放,因为你有一个强引用。在你强引用self期间,原来的weakSelf可以安全使用,因为self不会被释放。