【发布时间】:2021-03-24 02:28:23
【问题描述】:
这是一个简单的 API 类,如下所示。
class API {
func fetchData(_ callback: @escaping (Data) -> Void) {
// reqeust to server...
callback(response)
}
}
当我们在下面的代码中调用fetchData 时,我们使用[weak self] 来防止保留循环。
我正在使用DispatchQueueue.main.async 来更新主线程中的 UI。
我也需要[weak self]吗?
哪个是正确的,fooA 或 fooB?
class MyViewController: UIViewController {
let api = API()
func fooA() {
api.fetchData { [weak self] data in
self?.doSomething()
DispatchQueue.main.async { [weak self] in
self?.updateUI(data)
}
}
}
func fooB() {
api.fetchData { [weak self] data in
self?.doSomething()
DispatchQueue.main.async {
self?.updateUI(data)
}
}
}
}
【问题讨论】:
-
我这里也需要[弱自我]吗? - 不,你不需要。
-
当然
[weak self]必须在两个地方。这两个块都是独立的,并且是异步的。您可能会完成 fetchData,安排 updateUI 的执行,并且在它有时间发生之前,您的视图控制器已经准备好死亡。所以要平静地死去,它需要第二个【弱我】
标签: swift memory memory-leaks grand-central-dispatch ownership-semantics