gpt4 book ai didi

ios - 持有对使用闭包的本地对象的强引用 [Swift]

转载 作者:行者123 更新时间:2023-11-28 11:40:30 25 4
gpt4 key购买 nike

我有一个关于对使用闭包的本地对象持有强引用的问题。我有以下代码,其中对象 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com