Closure比其创建的实例更长久

问题描述 投票:1回答:2

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

swift memory-management closures
2个回答
0
投票

@escaping认为封闭可能比创造它的背景更长久。闭包是一个对象,它具有关联状态(即您的捕获列表)以及对函数的引用。您的数据源保留了关闭,因此它至少在数据源挂起时保持活动状态。并不是说如果你的闭包保留了自己,这可能是一个问题,因为那么自我也会持续至少与闭包持续时间一样长,这与Datasource持有它一样长。


0
投票

闭包是用于存储器管理的对象。在UberDataFetcher的回调中引用它意味着它被该闭包保留。所以它一直保持活着,以及它捕获的任何东西,直到该范围结束。

let uberManager = UberDataFetcher()
uberManager.getPrice {
    print("In Data Source")
    success()    // <--- Captured
}    // <--- End of scope
© www.soinside.com 2019 - 2024. All rights reserved.