假设我有一个视图控制器,并在其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
对象;这意味着该函数返回后,对象将被释放。补全块如何超过其创建实例的寿命?
答案 0 :(得分:0)
@escaping
将闭包标记为可能超出了创建闭包的上下文。闭包是具有关联状态(即,捕获列表)以及功能引用的对象。您的数据源将保留闭包,因此至少在数据源挂在其上时,该闭包才有效。这并不是说如果您的闭包保留了self可能会成为问题,因为self还将持续至少持续到闭包持续的时间,即Datasource坚持的时间。
答案 1 :(得分:0)
闭包是用于内存管理的对象。在UberDataFetcher
的回调中引用它意味着它由 that 闭包保留。因此,它以及它捕获的所有内容都会一直存在,直到该作用域结束为止。
let uberManager = UberDataFetcher()
uberManager.getPrice {
print("In Data Source")
success() // <--- Captured
} // <--- End of scope