gpt4 book ai didi

ios - 优化捕获列表

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:24 25 4
gpt4 key购买 nike

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

所有对象都是 self 的属性(假设是一个 View Controller ),并且与 self 具有相同的生命周期。我们可以引入一个生命周期比 self 更短的对象,这将是 weak,但同样的问题也适用。

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

对比

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()
}

在这种情况下,delegate 的生命周期可以比self 短,但为什么不这样使用呢?

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()
}

当闭包运行时,将在 self 上查找current delegate

在 Apple 示例版本中:

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

delegate?.doSomething()
}

捕获列表中的弱 delegate var 正在复制 self 上的 delegate 指针存在于关闭时间声明,而不是执行。因此,如果 self.delegate 的值在闭包声明后发生变化,并且在闭包运行时有所不同,Apple 版本的闭包将有一个 nil 委托(delegate)(假设是因为对旧版本的引用代表很虚弱)什么都不做。

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

关于ios - 优化捕获列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com