Ios 完成块中的调用操作没有内存泄漏

Ios 完成块中的调用操作没有内存泄漏,ios,swift,nsoperation,Ios,Swift,Nsoperation,我正在使用swift创建一个iOS应用程序 假设我想在与主线程不同的线程中对数组进行排序。我可以将NSOperation子类化如下: import UIKit class Operation: NSOperation { var array:[Int] init(array:[Int]){ self.array=array println("Operation init") } deinit{ println

我正在使用swift创建一个iOS应用程序

假设我想在与主线程不同的线程中对数组进行排序。我可以将NSOperation子类化如下:

import UIKit

class Operation: NSOperation {

    var array:[Int]

    init(array:[Int]){
        self.array=array
        println("Operation init")
    }

    deinit{
        println("Operation deinit")
    }

    override func main() {
        for i in 0..<array.count{
            for j in 0..<array.count{
                if array[i]<array[j]{
                    let k = array[i]
                    array[i] = array[j]
                    array[j] = k
                }
            }
        }
    }

}
我的问题是:如果我在operation.completionBlock中调用operation.array,操作将永远不会被释放,那么我如何在completion block(或其他地方)中检索已排序的数组

我能找到办法。这是为了创建一个仅以数组作为属性的对象,并将此对象传递给Operation,然后我将能够在对象中检索数组,但肯定它确实存在一种更好的方法


谢谢

有几种方法可以解决这个问题。这里有一个:

operation.completionBlock = { [unowned operation] in
    operation.array // use your array
}
operation.completionBlock = {
    println("done")
    // other stuff involving operation.array
    operation.completionBlock = nil
}

这将在完成块结束时中断保留循环。

操作。数组

 func testSortArray() {
    let array = [6,5,4,3,2,1]
    let operation = Operation(array: array)
    let operationQueue = NSOperationQueue()
    operationQueue.addOperation(operation)
    operation.completionBlock = {
        println("done \(operation.array)")
    }
}
 func testSortArray() {
    let array = [6,5,4,3,2,1]
    let operation = Operation(array: array)
    let operationQueue = NSOperationQueue()
    operationQueue.addOperation(operation)
    operation.completionBlock = {
        println("done \(operation.array)")
    }
}