在响应完成处理程序中声明 Weak

Declare Weak in response completion handler

我正在学习弱与强,但仍未完全掌握。如何在以下函数中声明弱响应,这样我就没有保留循环?

AF.request(url, method: .get).validate().responseData { [weak self] response in
    guard let data = response.data else {
        completionHandler(.failure(.apiFailed))
        return
    }

    do {
        let decodedData = try JSONDecoder().decode(T.self, from: data)
        
        DispatchQueue.main.async {
            completionHandler(.success(decodedData))
        }
    } catch {
        completionHandler(.failure(.corruptedData))
        return
    }
}

现在我有一个 xcode 警告说:

Variable 'self' was written to, but never read

如何使用弱读?

只有当一​​个对象最终通过一系列 strong 关系(通常是通过链中的一个或多个对象)拥有自己时,才会发生保留循环。例如,如果对象 A 与对象 B 具有所有权关系,并且对象 B 与对象 A 具有所有权关系,则 A 结束与自身拥有关系,这可以防止它被释放。打破这个循环需要这些对象之一将其所有权更改为非所有权关系(weak,或unowned)。 (如果 Astrong 引用直接存储到自身,或者如果链变为 A -> B -> C -> D -> A,或任何数量的其他配置,也会发生这种情况。)

在这样的回调上下文中,您 运行 进入保留循环的风险是,如果对象 A 存储一个具有 strong (隐式默认值)的闭包在其中某处引用 A,它循环引用自身。

但是: 只有当闭包实际上有理由首先维护对 Astrong 引用时才会发生这种情况。例如,您的闭包从不在其中引用 self,因此没有理由维护对 selfstrong 或其他内容的引用。闭包只维护对它们内部使用的事物的引用(或“关闭”,因此称为“闭包”)——而 self 不是。

因此警告:您永远不会“阅读”(即访问)self 闭包内的任何地方,因此 [weak self] 完全没有必要。