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 { ... }
}
请注意,这必须分成两行,因为无法从其自身的初始值引用变量。
为了避免在 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 { ... }
}
请注意,这必须分成两行,因为无法从其自身的初始值引用变量。