等待完成块会导致泄漏吗?

时间:2016-03-25 08:44:25

标签: ios swift memory-leaks

让我们说我有一个方法:

func getData(id:Int, completion: (object: object, error: Error?) -> ()){

        // some code

        let error = ErrorParser.parseData(data!)

        if error?.statusCode <= 200 {
            // do sth
        }
        else {
            completion(object: object, error: error)
        }

    }

}

我的问题是,当我从另一个类调用此方法并且永远不会调用完成块时会发生什么(调用类永远不会返回块)?这样安全吗?

1 个答案:

答案 0 :(得分:1)

这取决于您在// some code中跳过的部分。 让我们假设您正在使用正在执行异步请求的第三方库:

func getData(id:Int, completion: (object: object, error: Error?) -> ()){
    MyLibrary.doRequest(id: id) { data in
        let error = ErrorParser.parseData(data!)
        if error?.statusCode <= 200 {
            // do sth
        }
        else {
            completion(object: object, error: error)
        }
    }
}

在这里,您将新的闭包(我们将其命名为B)作为MyLibrary.doRequest方法的参数传递。并且completion闭包捕获了B参数,并且在释放此闭包之前不会释放。B参数。 然后MyLibrary在某处存储对B闭包的强引用,很可能在请求完成(或失败)和B闭包后释放func getData(id:Int, completion: (object: object, error: Error?) -> ()){ let data = OtherLib.loadDataFromDisk(id) let error = ErrorParser.parseData(data!) if error?.statusCode <= 200 { // do sth } else { completion(object: object, error: error) } } 闭包被执行。

或者你可以在这里找到一些同步代码:

XGBoost

在这种情况下,您的完成块将在函数返回后释放。