Swift 传递属于self的函数是否会在不处于闭包状态时导致retain循环?

Swift 传递属于self的函数是否会在不处于闭包状态时导致retain循环?,swift,memory-management,functional-programming,swift2,retain-cycle,Swift,Memory Management,Functional Programming,Swift2,Retain Cycle,如果您需要在闭包内部引用self,最好将其作为weak或unowned传递,以防止保留循环 如果我直接传递属于self的函数,是否会导致保留循环?或者它是否需要嵌套在一个闭包中来削弱self 直接传球 UIView.animateWithDuration(0.3, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.1, options: .CurveE

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

如果我直接传递属于
self
的函数,是否会导致保留循环?或者它是否需要嵌套在一个闭包中来削弱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)

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


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

这不应该创建一个引用循环,但即使它创建了引用循环,也没关系。参考循环只会存在,直到动画完成,此时它将被打断。创建短期引用周期实际上是有益的,因为它可以确保目标在调用生命周期内继续存在。周期本身并不是一个问题。牢不可破的循环是问题所在

有两个原因说明这不会产生循环。首先,不存在“循环”,系统肯定会引用一些东西(稍后会有更多的内容)。但是“引用那个东西的东西”的引用在哪里呢?更清楚地说,即使动画系统引用了
self
,那么
self
是如何引用动画系统的呢?没有循环

没有循环的另一个原因是您没有将
self
传递给动画系统。需要您的传球
self.view.layoutifn
。在Swift中,这相当于:

UIView.layoutIfNeeded(self.view)
您没有通过这里的
self
。你经过一个风景区。现在,动画系统几乎肯定会保留对该视图的引用,直到动画完成,但这没关系。这还不是一个循环