Swift NSBlockOperation() 泄漏:无法使 NSBlockOperation() 变弱

Swift NSBlockOperation() Leak: cannot make NSBlockOperation() weak

为了避免在 Objective-C 中使用 NSBlockOperation 时发生内存泄漏,我们必须将变量声明为 weak 以便能够引用块内的块操作(如果需要则取消),通常像这样:

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

但是在 Swift 中,当我尝试将我的 NSBlockOpeartion 声明为弱时,它始终为零。

weak var blockOp = NSBlockOperation()

没有弱引用,一切都很好,只是每次都会泄漏一点内存。如何在 Swift 中引用块内的块而不泄漏内存?

您可以使用显式 捕获列表 来捕获对该操作的无主引用。 (这是我实际上建议使用无主引用的唯一一次,因为只要它的块正在执行,该操作就会保留。如果您仍然对这种保证感到不舒服,您可以改用 weak .)

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

请注意,这必须分成两行,因为无法从其自身的初始值引用变量。