ios – 优化捕获列表

有这样的事吗?下面两个有什么区别吗?一个比另一个更“正确”吗?

所有对象都是self的属性(比如一个视图控制器),并且与self具有相同的生命周期.我们可以引入一个寿命比自己短的物体,这个物体很弱,但同样的问题也适用.

objectOne.doSomething { [unowned self] in
    self.objectTwo.finish()
    self.tableView.reloadData()
    // self.someDelegate?.didFinishSomething()
}

VS

objectOne.doSomething { 
    [unowned objectTwo = self.objectTwo,
    unowned tableView = self.tableView
    // weak someDelegate = self.delegate
    ] in
    objectTwo.finish()
    tableView.reloadData()
    // someDelegate?.didFinishSomething()
}

Apple在their docs中有这个例子:

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

    delegate?.doSomething()
}

在这种情况下,委托可以比自己更短的生命周期,但为什么不这样使用它?

lazy var someClosure: () -> String = { 
    [unowned self] in
    // closure body goes here

    self.delegate?.doSomething()
}

最佳答案 是的,有一个重要的区别.对于Apple文档,您提供的代码替代方案:

lazy var someClosure: () -> String = { 
    [unowned self] in
    // closure body goes here

    self.delegate?.doSomething()
}

当关闭运行时,将查找当前自动委托.

在Apple示例版本中:

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

    delegate?.doSomething()
}

捕获列表中的弱委托var是在关闭声明时复制自己的委托指针,而不是执行.因此,如果self.delegate的值在声明闭包后发生更改,并且在闭包运行时不同,则闭包的Apple版本将具有nil委托(假设因为对旧委托的引用很弱)并且什么都不做.

因此,作为一般规则,在捕获列表中复制值或引用([someIdentifier = someProperty])是如何使用在定义闭包时存在的值或引用.虽然在捕获列表中声明弱或无主自我([weak self])然后访问该弱引用上的属性({self?.someProperty})将获得执行闭包时存在的属性值.

点赞