为了避免在Objective-C中使用NSBlockOperation时出现内存泄漏,我们必须将变量声明为弱以便能够引用块内的块操作(如果需要则取消),通常如下所示:
__weak NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
if (blockOp.cancelled) {
...
}
}];
但是在Swift中,当我尝试将我的NSBlockOpeartion声明为弱时,它总是为零。
weak var blockOp = NSBlockOperation()
没有弱引用,一切都很好,除了每次泄漏一点内存。如何引用块内的块而不会在Swift中泄漏内存?
答案 0 :(得分:3)
您可以使用显式的捕获列表来捕获对该操作的无主参考。 (这是我实际建议使用无主引用的唯一时间之一,因为只要块正在执行,操作将被保留。如果您对该保证仍感到不舒服,可以使用weak
代替。)
let op = NSBlockOperation()
op.addExecutionBlock { [unowned op] in
print("hi")
if op.cancelled { ... }
}
请注意,必须将其拆分为两行,因为无法从其自己的初始值引用该变量。