代码之家  ›  专栏  ›  技术社区  ›  AppsDev

闭包和静态函数

  •  2
  • AppsDev  · 技术社区  · 6 年前

    我有一个 ViewModel 用如下方法初始化:

    func getUserSettings() {
       UserSettingsManager.getInfo { (result, error) in
         if error == nil {
            self.userData = result
         }
       }
    }
    

    这个班 viewModel 被实例化,然后 viewModel.getUserSettings() 被调用。这种方法正在调用 static 方法 UserSettings.getInfo 通过了一个 @escaping 结束被称为完成。这一结束正在捕获 视图模型 (它正在使用 self 在它的身体里)。

    1. 打电话给A会有什么后果? 静止的 方法有关于记忆的吗?那怎么办 UserSettings 未实例化的类是否为“释放”?

    2. 在这个特定的场景中,是否会发生强引用循环?如果是,应该怎么做 自己 被捕获: weak strong ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   woodcutting    6 年前

    调用静态方法会产生什么后果 记忆?未实例化的UserSettings类将如何 “解除分配”?

    在您的问题上下文中,函数是静态的这一事实没有任何特殊的内存含义。静态方法与非静态方法一样,具有创建引用循环的潜力。

    如你所说,如果没有 UserSettingsManager ,不会释放任何实例。这一事实本身并不能消除参考周期的可能性。

    在这个特定的场景中,是否会发生强引用循环?如果是这样,自我应该如何被俘获:软弱还是坚强?

    取决于里面发生了什么 getInfo ,这可能会创建一个引用循环。虽然看起来不太可能,但你不可能用你发布的片段来确定。

    为了澄清这一点,我应该提到你目前正在强烈地捕捉自我,这是默认的。这意味着闭包会增加 self 这样,当最终调用闭包时,它可以成功地与该实例交互。要覆盖此行为并避免引用循环,可以使用 [weak self] .

    最后,为了可视化您当前的方法,您可以用以下方式来考虑它:

    用户设置管理器 艾斯 closure 艾斯 自己

    那是一条干净的链子!只有当其中一个链接得到另一个链接的引用时,才会发生引用循环。