此代码是否存在内存问题?

时间:2015-05-31 21:54:15

标签: ios swift

Swift的新手,我想知道我是否必须像在Objective-C中那样处理(可能)此代码中的相同问题:

var itemB = EditableItem(title: "Item J")
itemB.onReturn = {(value) in
  var s = itemB.title
  println(value)
}

闭包有itemB的引用,itemB引用了闭包。这会导致循环引用,从而导致Swift中的内存泄漏,还是Swift足够聪明,使其成为闭包内的itemB弱变量?

如果没有,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不,只要itemB设置在外面,闭包内的itemB就会存在。

示例,您可以在Playground中进行测试。

假设我们在您的示例中使用此类映射:

Import Foundation
class EditableItem {
  var title = ""
  var onReturn: ((String)->Void)?

  init(title: String) {
    self.title = title
  }

  deinit {
    println("Deinit")
  }
}

现在我们运行与您类似的代码:

// Using optional so that I can set it do nil = will dealloc
var itemB:EditableItem? = EditableItem(title: "Item J")
itemB!.onReturn = {(value) in
  var s = itemB!.title
  println(value)
}

// Execute to make sure anything would retain
itemB!.onReturn!("data")
// var is set to nil, same variable inside the closure
itemB = nil // Deinit will run 

变量保留的相同示例:

var retainer:EditableItem? = nil

var itemB:EditableItem? = EditableItem(title: "Item J")
itemB!.onReturn = {(value) in
  retainer = itemB!
  println(value)
}

// If onReturn() would not be executed, itemB would not be retained
itemB!.onReturn!("data")
// deinit will not be called
itemB = nil

使参考文章变弱的例子:

var retainer:EditableItem? = nil

var itemB:EditableItem? = EditableItem(title: "Item J")
// Make sure retainer is weak
itemB!.onReturn = { [weak retainer](value) in
  retainer = itemB!
  println(value)
  // retainer is set here..
}
// retainer is nil here..
itemB!.onReturn!("data")
// retainer is nil here as well..
itemB = nil // And this will deinit
相关问题