传递属于self的函数是否会在不在闭包中时导致保留周期?

时间:2015-12-07 15:58:18

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

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

如果我直接传递属于self的函数,它会导致保留周期吗?或者它是否需要嵌套在闭包内以削弱自我?

直接传递

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)

2 个答案:

答案 0 :(得分:3)

这不应该创建一个参考周期,但即使这样做也没关系。参考循环仅在动画完成之前存在,此时它将被破坏。创建短暂的参考周期实际上可能是有益的,因为它确保目标在呼叫的整个生命周期中继续存在。周期本身不是问题。 牢不可破的周期就是问题所在。

这有两个原因导致这不会产生循环。首先,没有“循环”。系统将引用某些东西(更多内容会在一秒内),当然。但在哪里引用“引用那些东西的东西?”更清楚地说,即使动画系统引用了selfself如何引用动画系统?没有循环。

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

UIView.layoutIfNeeded(self.view)

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

答案 1 :(得分:1)

没有引用周期,因为self没有捕获闭包,但如果你不想要另一个强引用self,你可以使用包装闭包。

如果您确定在接下来的0.3秒内未self取消分配,则可以使用unowned,否则weak。 (我会使用weak来确保它不会崩溃)