我有很多UIImage批处理操作。我将它们一次性添加到NSOperationQueue的一个实例中:
self.operationQueue.addOperations(operations, waitUntilFinished: false)
但是似乎operationQueue会捕获所有操作,并在它们全部完成后释放它们。
我的操作实例继承自这个类
我该如何释放刚刚完成的操作?我错过了什么吗?
我有很多UIImage批处理操作。我将它们一次性添加到NSOperationQueue的一个实例中:
self.operationQueue.addOperations(operations, waitUntilFinished: false)
但是似乎operationQueue会捕获所有操作,并在它们全部完成后释放它们。
我的操作实例继承自这个类
我该如何释放刚刚完成的操作?我错过了什么吗?
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 ...