【问题标题】:Does waiting for completion blocks cause leaks?等待完成块会导致泄漏吗?
【发布时间】:2016-03-25 08:44:24
【问题描述】:

假设我有一个方法:

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)
        }

    }

}

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

【问题讨论】:

    标签: ios swift memory-leaks


    【解决方案1】:

    这取决于您在// some code 中跳过的部分。 假设您正在使用一些正在执行异步请求的 3rd 方库:

    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 闭包捕获,并且在此闭包释放之前不会被释放。 然后 MyLibrary 会在某处存储对 B 闭包的强引用,很可能它将在请求完成(或失败)并执行 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)
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-03
      • 2021-04-10
      • 2011-10-17
      • 2021-03-23
      • 2021-09-25
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多