NSOperation在队列结束时被释放

3

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

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

但是似乎operationQueue会捕获所有操作,并在它们全部完成后释放它们。

我的操作实例继承自这个

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

1个回答

4

addOperations(operations, waitUntilFinish:false)并没有隐式地保留所有操作直到完成,实际上它等同于for operation in operations { addOperation(operation) }。以下是证据。

你可能会发现你的操作存在一个bug,即它从未成功地转换/发出 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
...

谢谢您的解释。我会去调查一下! - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接