【问题标题】:MVVM: binding the View with the ViewModel with closures, how that results in retain cycle?MVVM:使用闭包将 View 与 ViewModel 绑定,这如何导致保留周期?
【发布时间】:2023-04-06 00:38:01
【问题描述】:

我正在实现一个简单的 ItemListing 应用程序,其中 ProductList 视图控制器管理一个表视图,该视图显示调用 REST 服务的结果。 Detail viewController 管理一个视图,我在其中显示有关 ProductListVC 中所选项目的更多信息。我正在尝试应用 MVVM 模式。我正在使用闭包来绑定视图模型和视图控制器。在 ProductList viewController 中,我以这种方式创建和初始化它的 viewModel:

class ProductListVC: UIViewController {
    var viewModel: ProductViewModel = ProductViewModel()
    var productTblView = UITableView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        initViewModel()
    }
    
    func initViewModel() {
        viewModel.reloadTableViewClosure = { [weak self] () in
            DispatchQueue.main.async {
                self?.productTblView.reloadData()
            }
        }
    
        viewModel.fetchData()
    }
}

我的问题是在reloadTableViewClosure 中使用[weak self] 有什么需要?在这种情况下,强引用是如何发生的?如果有人能解释[weak self][unowned self] 在这种情况下的用法,那就太好了。我的困惑是,由于 reloadTableViewClosure 归 viewmodel 所有,self 如何保持对闭包的强引用?

【问题讨论】:

    标签: swift mvvm closures weak-references


    【解决方案1】:

    这里 [weak self] 用于您的 productTblView,而不是用于 viewModel。 “self”在这里为 ProductListVC 指定。 假设控制器对象已被释放,然后我们强烈更新 productTblView。这会导致崩溃,所以我们使用 [weak self]/[unowned self]。

    【讨论】:

    • 感谢您的回复。如果您能解释更多细节,那就太好了。如果我没有添加 [weak self] 或 [unowned self],强引用循环是如何发生的。我是 iOS 编程的初学者,试图清楚地理解概念。提前谢谢你
    • 当你不使用 weak 和 unowned 时,它是一个强引用。为了避免强引用,我们需要使用弱引用和无主引用。每当我们在 dispatch 块中使用对象时直接用 self 调用,它都会产生一个强引用。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2018-10-30
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多