2015-06-02 55 views
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 –

+2

顺便说一下,强烈的舞蹈错误。你还需要测试'strongSelf'是否为零。在这种情况下,没有什么区别,但总的来说这是个好主意。 – matt

+0

@matt弱弱舞蹈的正确方法是什么? –

回答

6

恐怕是这样。 [strongSelf setMyBlock:<inner block>]将导致self保留内部块。如果内部块有很强的参考self,这是一个循环。 strongSelf变量被分配 a __weak合格变量最初没有区别。

正如其他一些用户提到的,您可以使用原始的weakSelf而不是创建一个新的。在块中创建strongSelf引用的原因是,否则self可能会在块运行时解除分配。 strongSelf将结束nil(如果在分配strongSelf之前已解除分配self,但这不会造成任何伤害),否则self而不是在块正在执行时被释放,因为您有很强的参考。在你有很强的参考self的时候,原来的weakSelf也是安全使用,因为self不会被释放。