NSOperation在队列结束时发布

时间:2015-11-13 17:20:23

标签: ios swift memory-management nsoperation nsoperationqueue

我有很多UIImage批处理操作。我在NSOperationQueue:

的实例中添加了一次
self.operationQueue.addOperations(operations, waitUntilFinished: false)

但似乎operationQueue捕获了所有操作并在所有操作完成后释放它们。

我的操作实例继承自此class

如何发布刚刚完成的操作?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

addOperations(operations, waitUntilFinish:false)在完成之前不会隐式保留所有操作,它与for operation in operations { addOperation(operation) }基本相同。证据如下。

您可能正在查看您的操作中的一个错误,它从未成功转换为/ isFinished。如果您的操作最终在所有操作都完成时解除分配,这似乎不太可能。

更可能的是,您可能在某处依赖于这些操作的某些完成代码:

  • 你可以有一个关闭,保持对operations的引用。
  • 您可以进行从属操作:operation.addOperation(...)
  • 您可以在队列上调用waitUntilAllOperationsAreFinished(),该队列将保留对操作的引用,直到它们全部完成。

证明

您可以通过以下操场证明操作未在完成后保留:

import Foundation

class Operation: NSOperation {
    let id:Int
    init(id:Int) { self.id = id }
    override func main() { usleep(useconds_t(id * 100000)) }
    deinit { print("Deiniting \(id)") }
}

let queue = NSOperationQueue()

do {
    let operations = (0..<50).map(Operation.init)
    queue.addOperations(operations, waitUntilFinished: false)
}

for i in 0..<50 {
    usleep(200000)
    print("Heartbeat")
}

您将看到在循环运行时以固定间隔解除分配的实例。

Deiniting 0
Deiniting 1
Heartbeat
Deiniting 2
Deiniting 3
Heartbeat
Deiniting 4
Deiniting 5
...