【发布时间】:2020-12-27 23:54:28
【问题描述】:
这是我从网络中获取一些数据的方法:
func fetchProducts(parameters: [String: Any],
success: @escaping ([Product]) -> Void)
正如您所注意到的,它具有转义闭包。这是我在 ViewModel 中调用上述方法的方式:
service.fetchProducts(parameters: params, success: { response in
self.isLoading?(false)
/// doing something with response
})
问题是我应该弱还是强捕获self?为什么?我想我可以强烈地捕捉到它。因为,fetchProducts 是一个以闭包为参数的函数。但是,我可能错了。但是,从另一个角度来看,我认为它应该是弱的。因为,ViewModel 强引用 service,service 强引用 success 闭包,强引用 self(即 ViewModel)。它创建了保留周期。但是在取消初始化拥有 ViewModel 的 ViewController 之后,无论如何都会调用 ViewModel 的 deinit。这意味着没有保留周期。为什么?
【问题讨论】:
标签: ios swift memory-management automatic-ref-counting retain-cycle