block in block导致self被保留,__block不起作用

时间:2012-10-11 02:45:44

标签: objective-c ios block

添加:当我在函数中复制块时发生问题:    [块复制]

我已经在使用__block来避免保留自己。                 __block typeof(self)bself = self;

但是,如果此块中有另一个块,并且它使用了bself,则仍然会保留self。

如下面的代码所示,第一个bself不会按预期保留自己。然而,第二个人将保留自己。

            __block typeof(self) bself = self;

            [layer start:param1
                  completeHanlder:^{
                      bself.xx = localxx;

                      dispatch_async(dispatch_get_main_queue(), ^(void) {
                          ... ...
                          [bself something];
                      });
                  }
             ];
谁知道背后的原因?

1 个答案:

答案 0 :(得分:-1)

你做错了,但概念是对的,这里是错误:

__ block

这用于在块内部进行强引用。例如,您可以更改块外的值。

正确的方法是使用__weak,它将从您的实例接收弱引用并阻止强循环引用,如下所示:

 __weak typeof(self) bself = self;

因为你创建的__block保留并且强引用:)