关闭比其创建的实例有效

时间:2019-03-18 19:50:42

标签: swift memory-management closures

假设我有一个视图控制器,并在其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对象;这意味着该函数返回后,对象将被释放。补全块如何超过其创建实例的寿命?

2 个答案:

答案 0 :(得分:0)

@escaping将闭包标记为可能超出了创建闭包的上下文。闭包是具有关联状态(即,捕获列表)以及功能引用的对象。您的数据源将保留闭包,因此至少在数据源挂在其上时,该闭包才有效。这并不是说如果您的闭包保留了self可能会成为问题,因为self还将持续至少持续到闭包持续的时间,即Datasource坚持的时间。

答案 1 :(得分:0)

闭包是用于内存管理的对象。在UberDataFetcher的回调中引用它意味着它由 that 闭包保留。因此,它以及它捕获的所有内容都会一直存在,直到该作用域结束为止。

let uberManager = UberDataFetcher()
uberManager.getPrice {
    print("In Data Source")
    success()    // <--- Captured
}    // <--- End of scope