捕获列表:对类实例或初始化变量的引用?

时间:2016-07-04 16:38:30

标签: swift closures automatic-ref-counting

在定义闭包捕获列表的http://docs.cksource.com/ckfinder3-net/howto.html#howto_private_folders

  

捕获列表中的每个项目都是弱者或无人物的配对   带有对类实例(如self)或a的引用的关键字   用一些值初始化的变量(例如delegate =   self.delegate!)。这些配对写在一对正方形内   括号,用逗号分隔。

     

将捕获列表放在闭包的参数列表之前并返回   输入时输入:

lazy var someClosure: (Int, String) -> String = {
    [unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
    // closure body goes here
}

但是(1)简单地引用自我还是(2)用self初始化一个新变量之间的确切区别是什么?

var someClosure: () -> String = {
  [unowned self]
  // Use self here
}

var someClosure: () -> String = {
  [unowned s = self]
  // Use s here
}

这个新变量是否会修改原始自我的防御,还是一个影响前一个自我的新自我?

1 个答案:

答案 0 :(得分:0)

变量只是一个内存位置的引用。根据变量类型 - 弱,强或无主,决定对象的生命周期。

如果在闭包内使用强变量,那个闭包将取得对象的所有权。它一直存在,直到关闭。

如果你使用weak,那么在该对象可用之前,这将引用该对象。当该对象释放时,变量设置为nil。

如果您使用无主,则永远不会拥有对象的所有权。即使释放了对象,也会指向该内存。

我在这里解释https://medium.com/@rajaths131/life-time-and-scope-of-swift-objects-da7c2e5f4e0f#.uzfy60x9s