soling soling - 4 years ago 116
iOS Question

Call operation in completion block without memory leak

I am creating an iOS app using swift.

Let's say I want to sort an array in a different thread that the main thread. I can subclass NSOperation like that :

import UIKit

class Operation: NSOperation {

var array:[Int]

println("Operation init")

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


In my ViewController, I can use something like :

import UIKit

class ViewController: UIViewController {

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

My question is :since if I call operation.array in operation.completionBlock, operation will never be released, How can I retrieve the sorted array in the completion block (or elsewhere)?

I can see a way. It's to create an object with just the array as property and pass this object to Operation then I will be able to retrieve the array within the object but for sure it does exist a better way.

Thank you

Answer Source
operation.completionBlock = { [unowned operation] in
    operation.array // use your array
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download