我有一个关于在闭包和HTTP请求中使用[弱自我]的问题。
例如,我们有一个 HTTP 请求,它在完成时触发闭包:
func saveBla() {
blaManager.saveBla(bla) { error in
self.pay5euro()
}
}
我的问题是:我是否需要在这里使用弱引用?首先,我不想在移动到另一个页面后丢失来自 api 调用的响应。除此之外,我不想创建一个内存泄漏的保留周期?
func saveBla() {
blaManager.saveBla(bla) { [weak self] error in
guard let strongSelf = self else { return }
strongSelf.pay5euro()
}
}
在这种情况下,真的需要用一个[弱的自我]吗?
这取决于您的经理和控制器之间的关系。
结论:如果 A 拥有 B 且 B 拥有 A 而没有弱引用,则会导致保留循环。
class NetManager {
func fire(completion: (_ result: Bool) -> Void) {
completion(true)
}
}
class controler: UIViewController {
override func viewDidLoad() {
let manager = NetManager()
// In this case the Manager and Controller NOT own each other,
// And the block will release after request finished, it is ok to not use weak.
manager.fire { (result) in
}
}
let manager = NetManager()
func anOtherExample() {
// In this case the controller own the manager,
// manager own the controller, but manager will relase the controller after
// request finished, this will cause a delay to controller's relase, but it is still ok.
manager.fire { (result) in
}
}
}
如果您的经理行为如此,则经理将拥有控制器,当控制器拥有管理器时,这将导致保留周期。
class NetManager {
var completion: ((_ result: Bool) -> Void)?
func fire(completion: @escaping (_ result: Bool) -> Void) {
self.completion = completion
}
}
更多详细信息: https://krakendev.io/blog/weak-and-unowned-references-in-swift