根据我的理解,当对象方法接收一个 block 作为完成参数时,我可以在 block 中发送“self”:
[object doMethodWithCompletion:^{
[self doSomethingWhenThisMethodCompletes]
}];
但是如果这个对象“保留”该 block (保存它以供将来使用)我应该发送我自己的“弱”副本:
__weak __typeof__(self) weakSelf = self;
object.savedBlock = ^{
[weakSelf doSomethingWhenThisBlockIsCalledFromWithinObject];
};
但我也看到过一些变体,例如:
__weak __typeof__(self) weakSelf = self;
object.savedBlock = ^{
__typeof__(weakSelf) strongSelf = weakSelf;
[strongSelf doSomethingWhenThisBlockIsCalledFromWithinObject];
};
我不清楚为什么/何时进行最后一个变体
最佳答案
在 block 内创建强引用可确保如果 block 运行,对象不会在 block 中途被释放,这可能会导致意外的、难以调试的行为。
typeof(self) weakSelf = self;
[anObject retainThisBlock:^{
[weakSelf foo];
// another thread could release the object pointed to by weakSelf
[weakSelf bar];
}];
现在[weakSelf foo]
会运行,但[weakSelf bar]
不会运行,因为weakSelf现在是nil
。如果在 block 内创建强引用,则在 block 返回之前无法释放该对象。
关于ios - 使用 ARC 和 block 时保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325708/