根据我的理解,当对象方法将一个块作为完成参数接收时,我可以在该块中发送“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/

10-10 20:58