1

Objective-C で NSBlockOperation を使用する際のメモリ リークを回避するには、変数を weak として宣言して、ブロック内のブロック操作を参照できるようにする必要があります (必要に応じてキャンセルするため)。通常は次のようになります。

__weak NSBlockOperation *blockOp  = [NSBlockOperation blockOperationWithBlock:^{
     if (blockOp.cancelled) {
         ...
     }
}];

しかし、Swift では、NSBlockOeartion を弱いと宣言しようとすると、常に nil になります。

weak var blockOp = NSBlockOperation()

弱い参照がなければ、毎回少しずつメモリ リークが発生することを除けば、すべて問題ありません。Swiftでメモリをリークせずにブロック内のブロックを参照するにはどうすればよいですか?

4

1 に答える 1

3

明示的なキャプチャ リストを使用して、操作への所有されていない参照をキャプチャできます。(これは、ブロックが実行されている限り操作が保持されるため、所有されていない参照の使用を実際に提案する唯一のケースの 1 つです。それでもその保証に不安がある場合は、weak代わりに使用できます。)

let op = NSBlockOperation()
op.addExecutionBlock { [unowned op] in
    print("hi")
    if op.cancelled { ... }
}

変数はそれ自体の初期値から参照できないため、これを 2 行に分割する必要があることに注意してください。

于 2016-04-19T23:47:01.513 に答える