块内的块的保留循环

4

我是否需要不断地声明弱引用来打破块内部的块的保留周期?

__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];
    }];  
}];

2
代码块可以使用它们所定义的函数的变量作用域,在您的情况下,您可以在内部块中使用外部块的weakSelf,不要创建其他weakSelf。 - Vinay Jain
2
顺便提一下,您做了弱-强舞蹈的错误。您还需要测试strongSelf是否为nil。在这种情况下没有什么区别,但通常是一个好主意。 - matt
@matt,如何正确地进行弱-强引用的处理? - Travis M.
1
对于不被self直接或间接保留的块,你不需要进行强弱引用的舞蹈。一个例子就是NSArray方法enumerateObjectsUsingBlock: - zaph
1个回答

6
很抱歉,[strongSelf setMyBlock:<inner block>] 会导致 self 持有内部块。如果内部块对 self 有强引用,这就构成了循环引用。即使最初的 __weak 变量赋值给了 strongSelf,也不会有任何区别。
正如其他用户所提到的,您可以使用原始的 weakSelf ,而不必创建一个新的变量。您在块中创建一个 strongSelf 引用的原因是,否则当块正在运行时,self 可能已被释放。如果在 strongSelf 被分配之前,self 已经被释放,那么 strongSelf 将为空(但这没有什么影响)。否则,由于您持有强引用,self 在块执行期间将不会被释放。在您持有对 self 的强引用期间,原始的 weakSelf 也是安全的,因为 self 不会被释放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接