在响应完成处理程序中声明 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
)。 (如果 A
将 strong
引用直接存储到自身,或者如果链变为 A -> B -> C -> D -> A
,或任何数量的其他配置,也会发生这种情况。)
在这样的回调上下文中,您 运行 进入保留循环的风险是,如果对象 A
存储一个具有 strong
(隐式默认值)的闭包在其中某处引用 A
,它循环引用自身。
但是: 只有当闭包实际上有理由首先维护对 A
的 strong
引用时才会发生这种情况。例如,您的闭包从不在其中引用 self
,因此没有理由维护对 self
、strong
或其他内容的引用。闭包只维护对它们内部使用的事物的引用(或“关闭”,因此称为“闭包”)——而 self
不是。
因此警告:您永远不会“阅读”(即访问)self
闭包内的任何地方,因此 [weak self]
完全没有必要。
我正在学习弱与强,但仍未完全掌握。如何在以下函数中声明弱响应,这样我就没有保留循环?
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
)。 (如果 A
将 strong
引用直接存储到自身,或者如果链变为 A -> B -> C -> D -> A
,或任何数量的其他配置,也会发生这种情况。)
在这样的回调上下文中,您 运行 进入保留循环的风险是,如果对象 A
存储一个具有 strong
(隐式默认值)的闭包在其中某处引用 A
,它循环引用自身。
但是: 只有当闭包实际上有理由首先维护对 A
的 strong
引用时才会发生这种情况。例如,您的闭包从不在其中引用 self
,因此没有理由维护对 self
、strong
或其他内容的引用。闭包只维护对它们内部使用的事物的引用(或“关闭”,因此称为“闭包”)——而 self
不是。
因此警告:您永远不会“阅读”(即访问)self
闭包内的任何地方,因此 [weak self]
完全没有必要。