NSOperation 在队列结束时释放

NSOperation's released at queue ending

我有很多 UIImage 批处理操作。我将它们添加到 NSOperationQueue 的实例中一次:

self.operationQueue.addOperations(operations, waitUntilFinished: false)

但是好像operationQueue会捕获所有的操作,并在所有操作完成后释放它们。

我的操作实例继承自这个class

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

addOperations(operations, waitUntilFinish:false)并不隐式保留所有操作直到完成,它本质上与for operation in operations { addOperation(operation) }相同。证明如下。

您可能正在查看操作中的错误,它从未成功转换 to/emits isFinished。如果您的操作最终在所有操作完成时取消分配,这似乎不太可能。

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

  • 您可以有一个闭包维护对 operations 的引用。
  • 您可能有一个依赖操作:operation.addOperation(...)
  • 您可以在队列上调用 waitUntilAllOperationsAreFinished(),它将保存对操作的引用,直到它们全部完成。

证明

您可以使用以下 playground 证明操作在完成后未保留:

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
...