根据我的理解,当对象方法将一个块作为完成参数接收时,我可以在该块中发送“self”:
[object doMethodWithCompletion:^{
[self doSomethingWhenThisMethodCompletes]
}];
但是,如果此对象“保留”了该块(将其保存以备将来使用),我应该发送自己的“弱”副本:
__weak __typeof__(self) weakSelf = self;
object.savedBlock = ^{
[weakSelf doSomethingWhenThisBlockIsCalledFromWithinObject];
};
但我也看到了一些变体,例如:
__weak __typeof__(self) weakSelf = self;
object.savedBlock = ^{
__typeof__(weakSelf) strongSelf = weakSelf;
[strongSelf doSomethingWhenThisBlockIsCalledFromWithinObject];
};
我不清楚为什么/何时做这最后一个变体
最佳答案
在块内部创建强引用可确保如果该块运行,则不会在该块的中途释放对象,这可能导致意外的,难以调试的行为。
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
。如果在块内创建强引用,则在块返回之前无法释放对象。关于ios - 使用ARC和块时保留周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20325708/