0

补充:当我在函数内复制块时出现问题:[块复制]

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

但是,当这个块中有另一个块,并且它使用 bself 时,self 仍然会被保留。

如下面的代码所示,第一个 bself 不会像预期的那样保留 self。然而,第二个自我将保留自我。

            __block typeof(self) bself = self;

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

                      dispatch_async(dispatch_get_main_queue(), ^(void) {
                          ... ...
                          [bself something];
                      });
                  }
             ];

有人知道背后的原因吗?

4

1 回答 1

-1

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

__堵塞

这用于在您的块中提供强引用。例如,您可以在块之外更改值。

正确的方法是使用 __weak 从您的实例接收弱引用并防止像这样的强循环引用:

 __weak typeof(self) bself = self;

而且因为您创建的 __block 保留和强引用:)

于 2015-08-26T11:59:09.647 回答