【问题标题】:Does passing a function belonging to self cause a retain cycle when not in a closure?当不在闭包中时,传递属于 self 的函数是否会导致保留循环?
【发布时间】:2015-12-07 15:58:18
【问题描述】:

如果您需要在闭包内引用self,最好将其作为weakunowned 传递以防止保留循环。

如果我直接传递属于self的函数,会不会导致retain循环?或者它是否需要嵌套在一个闭包中来弱化自我?

直接通过

UIView.animateWithDuration(0.3,
        delay: 0.0,
        usingSpringWithDamping: 0.7,
        initialSpringVelocity: 0.1,
        options: .CurveEaseOut,
        animations: self.view.layoutIfNeeded, // does this cause retain cycle? 
        completion: nil)

包装在一个闭包中

UIView.animateWithDuration(0.3,
        delay: 0.0,
        usingSpringWithDamping: 0.7,
        initialSpringVelocity: 0.1,
        options: .CurveEaseOut,
        animations: { [unowned self] in
            self.view.layoutIfNeeded()
        },
        completion: nil)

【问题讨论】:

    标签: swift memory-management functional-programming swift2 retain-cycle


    【解决方案1】:

    这不应该创建一个引用循环,但即使这样做也没关系。参考循环只会在动画完成之前存在,此时它将被破坏。创建短暂的引用周期实际上是有益的,因为它可以确保目标在调用期间继续存在。周期本质上不是问题。 牢不可破的循环是问题所在。

    这不会产生循环有两个原因。首先,没有“循环”。系统将引用 something(稍后会详细介绍),当然。但是对“引用该事物的事物”的引用在哪里?说得清楚一点,就算动画系统引用了self,那self又是怎么引用动画系统的呢?没有循环。

    没有循环的另一个原因是您无论如何都没有将self 传递给动画系统。你的传递self.view.layoutIfNeeded。在 Swift 中,这相当于:

    UIView.layoutIfNeeded(self.view)
    

    你没有在这里传递self。你正在传递一个视图。现在动画系统几乎肯定持有对该视图的引用,直到动画完成,但这没关系。这仍然不是一个循环。

    【讨论】:

      【解决方案2】:

      没有引用循环,因为self 不捕获闭包,但如果您不希望有另一个对self 的强引用,您可以使用包装闭包。

      如果您确定self 在接下来的 0.3 秒内没有被释放,您可以使用unowned,否则使用weak。 (我会使用weak 以确保它不会崩溃)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-21
        • 2019-10-15
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        • 2013-01-14
        • 2018-07-04
        • 2021-11-03
        相关资源
        最近更新 更多