我有一个关于对使用闭包的本地对象持有强引用的问题。 我有以下代码,其中对象 B 使用一个方法来关闭类型 A 的本地对象。 对象 A 中的方法使用异步操作执行一些网络任务,然后将闭包返回给对象 b。 由于对象 A 在 B 中的方法中是本地的,并且由于我在对象 A 异步任务中使用 [weak self](以防止保留循环),因此对象被释放。
我应该在以下代码中更改什么以确保仅在关闭完成时才释放本地 A 对象?
这是重要代码的一部分:
class A {
var restAPI: RestAPI?
func fetchNews(completion: (_ json: [String:Any])->()) {
// .....
self.restAPI.fetch(url: url, results: { [weak self] (json) in //
completion(json)
})
// .....
}
}
class B {
// ....
// ... call to updateNews()
func updateNews() {
let aFetcher: A()
aFetcher.fetchNews(completion : {
// <<<< // aFetcher gets released and closue never called
// parse...
}
}
}
最佳答案
您将 aFetcher 声明为 func updateNews() 范围内的 let
当 updateNews() 的范围到达其终点时,aFetcher 将被释放。
你的内部获取函数中有[weak self]。
在此阶段,aFetcher 将被释放,因为 updateNews() 已完成执行并且没有对该对象的强引用。
您只需向类 B 添加变量 aFetcher 以确保您对 aFetcher 具有强引用。
class B {
// MARK: - Vars
private let aFetcher = A()
// MARK: - Public
func updateNews() {
aFetcher.fetchNews(completion : {
// parse...
}
}
}
关于ios - 持有对使用闭包的本地对象的强引用 [Swift],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53795889/