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

时间:2016-04-19 22:42:30

标签: swift memory-management nsoperation nsblockoperation

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

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

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

weak var blockOp = NSBlockOperation()

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

1 个答案:

答案 0 :(得分:3)

您可以使用显式的捕获列表来捕获对该操作的无主参考。 (这是我实际建议使用无主引用的唯一时间之一,因为只要块正在执行,操作将被保留。如果您对该保证仍感到不舒服,可以使用weak代替。)

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

请注意,必须将其拆分为两行,因为无法从其自己的初始值引用该变量。