2015-02-26 12 views
6

Hızlı kullanarak bir iOS uygulaması oluşturuyorum.Bellek sızıntısı olmadan tamamlama blokunda çağrı işlemi

Diyelim ki bir diziyi ana iş parçacığı olarak farklı bir iş parçacığı içinde sıralamak istiyorum. Böyle NSOperation alt sınıf: Benim ViewController olarak

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

} 

, şöyle bir şey kullanabilirsiniz:

import UIKit 

class ViewController: UIViewController { 

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

Sorum şu: Ben operation.completionBlock içinde operation.array ararsanız beri, operasyon asla serbest bırakılır, tamamlanmış blokta (veya başka bir yerde) sıralanmış diziyi nasıl alabilirim?

Bir yol görüyorum. Sadece bir dizi özelliği ile bir nesne oluşturmak ve bu nesneyi İşlem'e iletmek, sonra dizideki nesneyi geri alabilmek ama daha iyi bir şekilde var olabilmek.

teşekkür ederiz

Bunu kaldırabileceğinden çeşitli yolları vardır

cevap

7
operation.completionBlock = { [unowned operation] in 
    operation.array // use your array 
} 
2

. İşte bir tane: Tamamlama bloğunun sonunda tutma döngüsünü bozar. Bu, tamamlanma bloğunun sonunda tutma döngüsünü bozar.

0

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)") 
    } 
}