swift - 闭包比它创建的实例寿命更长
问题描述
假设我有一个视图控制器,viewDidLoad
我在其中调用这个函数:
func callDataSource()
{
let dataSource = DataSource()
dataSource.callUber {
print("In viewDidLoad")
}
return
}
这DataSource
门课是
class DataSource {
func callUber(withSuccess success: @escaping (() -> Void))
{
let uberManager = UberDataFetcher()
uberManager.getPrice {
print("In Data Source")
success()
}
return
}
}
而这UberDataFetcher
只是一个调用 Uber API 的类。我的问题是:我已经DataSource
在函数范围内定义了对象callDataSource
;这意味着一旦该函数返回,对象就会被释放。完成块如何超过创建它的实例?
解决方案
@escaping
将闭包标记为可能超过创建它的上下文。闭包是具有关联状态(即您的捕获列表)以及对函数的引用的对象。您的数据源保留了闭包,因此至少只要数据源挂在它上面,它就会保持活动状态。并不是说如果您的闭包保留了 self 这可能是一个问题,因为这样 self 也将持续至少与闭包持续的时间一样长,只要 Datasource 保持它。
推荐阅读
- python - Python:有没有办法在你离开的地方继续一个随机序列?
- python - 逻辑回归预测阈值误差
- amazon-web-services - 我应该使用哪种 AWS API Gateway 授权方类型来通过 Okta 保护我的 API?Lambda/认知?
- typescript - 为联合中的不同类型构造不同的默认值?
- javascript - 通过 JavaScript 在 Dynamics CRM 表单中创建静态 URL 超链接
- r - 具有来自上述行的部分匹配数据的行进入 r 中的新列
- gcloud - 为什么 gsutil 在 powershell 中找不到 python 可执行文件?
- javascript - Discord 机器人验证系统
- ios - Xcode 12 GM 陷入无限循环
- angular - Jhipster 和 ngx-translate 停止使用升级到 0.14