让我们说我有一个方法:
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)
}
}
}
我的问题是,当我从另一个类调用此方法并且永远不会调用完成块时会发生什么(调用类永远不会返回块)?这样安全吗?
答案 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
在这种情况下,您的完成块将在函数返回后释放。