我对持有使用闭包的本地对象的强引用存在疑问。 我有以下代码,其中对象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...
}
}
}
答案 0 :(得分:1)
您将func updateNews()范围内的 aFetcher 声明为let 当 updateNews()的范围达到极限时,将释放aFetcher。 您的内部提取函数中有 [弱自我] 。 在此阶段,将释放aFetcher,因为updateNews()完成其执行并且对该对象没有强引用。
您只需要向B类添加变量 aFetcher ,以确保您对 aFetcher 有较强的引用。
class B {
// MARK: - Vars
private let aFetcher = A()
// MARK: - Public
func updateNews() {
aFetcher.fetchNews(completion : {
// parse...
}
}
}
答案 1 :(得分:1)
您需要在课程的顶层上有很强的参考力。
但是,不要永久保留引用并可靠地保留和释放该引用,请在class B
中添加一个可选的存储属性,并在完成闭包中将其设置为nil
:
class B {
var fetcher : A?
// MARK: - Public
func updateNews() {
fetcher = A()
fetcher!.fetchNews(completion : { [unowned self] in
// parse...
self.fetcher = nil
}
}
}