2

オブジェクトメソッドが完了引数としてブロックを受け取るときの私の理解から、ブロックで「自己」を送信できます。

[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];
}];

[weakSelf foo]は実行されますが、[weakSelf bar]weakSelf が now であるため実行されませんnil。ブロック内に強い参照を作成すると、ブロックが戻るまでオブジェクトを解放できません。

于 2013-12-02T10:22:31.803 に答える