首页 > 解决方案 > 闭包比它创建的实例寿命更长

问题描述

假设我有一个视图控制器,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;这意味着一旦该函数返回,对象就会被释放。完成块如何超过创建它的实例?

标签: swiftmemory-managementclosures

解决方案


@escaping将闭包标记为可能超过创建它的上下文。闭包是具有关联状态(即您的捕获列表)以及对函数的引用的对象。您的数据源保留了闭包,因此至少只要数据源挂在它上面,它就会保持活动状态。并不是说如果您的闭包保留了 self 这可能是一个问题,因为这样 self 也将持续至少与闭包持续的时间一样长,只要 Datasource 保持它。


推荐阅读