假设我有一个视图控制器,在它的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
认为封闭可能比创造它的背景更长久。闭包是一个对象,它具有关联状态(即您的捕获列表)以及对函数的引用。您的数据源保留了关闭,因此它至少在数据源挂起时保持活动状态。并不是说如果你的闭包保留了自己,这可能是一个问题,因为那么自我也会持续至少与闭包持续时间一样长,这与Datasource持有它一样长。
闭包是用于存储器管理的对象。在UberDataFetcher
的回调中引用它意味着它被该闭包保留。所以它一直保持活着,以及它捕获的任何东西,直到该范围结束。
let uberManager = UberDataFetcher()
uberManager.getPrice {
print("In Data Source")
success() // <--- Captured
} // <--- End of scope