2

据我了解,当对象方法接收块作为完成参数时,我可以在块中发送“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];
};

我不清楚为什么/何时做最后一个变种

4

1 回答 1

5

在块内创建强引用可确保如果块运行,对象不会在块中途被释放,这可能导致意外的、难以调试的行为。

typeof(self) weakSelf = self;
[anObject retainThisBlock:^{
    [weakSelf foo];
    // another thread could release the object pointed to by weakSelf
    [weakSelf bar];
}];

Now[weakSelf foo]会运行,但[weakSelf bar]不会因为 weakSelf 是 now nil。如果在块内创建强引用,则在块返回之前无法释放对象。

于 2013-12-02T10:22:31.803 回答