有这样的事吗?下面两个有什么区别吗?一个比另一个更“正确”吗?
所有对象都是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})将获得执行闭包时存在的属性值.