Swift NSBlockOperation() Leak: не может сделать NSBlockOperation () слабым
Чтобы избежать утечки памяти при использовании NSBlockOperation в Objective-C, мы должны были бы объявить переменную как слабую, чтобы иметь возможность ссылаться на операцию блока внутри блока (чтобы отменить при необходимости), как правило, так:
__weak NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
if (blockOp.cancelled) {
...
}
}];
Но в Swift, когда я пытаюсь объявить мой NSBlockOpeartion как слабый, он всегда равен нулю.
weak var blockOp = NSBlockOperation()
Без слабой ссылки все в порядке, за исключением того, что каждый раз происходит утечка памяти. Как я могу ссылаться на блок внутри блока без утечки памяти в Swift?
1 ответ
Вы можете использовать явный список перехвата, чтобы перехватить ненужную ссылку на операцию. (Это один из немногих случаев, когда я на самом деле рекомендую использовать неизвестные ссылки, поскольку операция будет сохраняться до тех пор, пока выполняется ее блок. Если вам все еще не нравится эта гарантия, вы можете использовать weak
вместо.)
let op = NSBlockOperation()
op.addExecutionBlock { [unowned op] in
print("hi")
if op.cancelled { ... }
}
Обратите внимание, что это должно быть разбито на две строки, потому что на переменную нельзя ссылаться из ее собственного начального значения.