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
。你经过一个风景区。现在,动画系统几乎肯定会保留对该视图的引用,直到动画完成,但这没关系。这还不是一个循环