添加:当我在函数中复制块时发生问题: [块复制]
我已经在使用__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];
});
}
];
谁知道背后的原因?
答案 0 :(得分:-1)
你做错了,但概念是对的,这里是错误:
__ block
这用于在块内部进行强引用。例如,您可以更改块外的值。
正确的方法是使用__weak,它将从您的实例接收弱引用并阻止强循环引用,如下所示:
__weak typeof(self) bself = self;
因为你创建的__block保留并且强引用:)