如果您需要在闭包内引用self
,最好将其作为weak
或unowned
传递,以防止保留周期。
如果我直接传递属于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)
答案 0 :(得分:3)
这不应该创建一个参考周期,但即使这样做也没关系。参考循环仅在动画完成之前存在,此时它将被破坏。创建短暂的参考周期实际上可能是有益的,因为它确保目标在呼叫的整个生命周期中继续存在。周期本身不是问题。 牢不可破的周期就是问题所在。
这有两个原因导致这不会产生循环。首先,没有“循环”。系统将引用某些东西(更多内容会在一秒内),当然。但在哪里引用“引用那些东西的东西?”更清楚地说,即使动画系统引用了self
,self
如何引用动画系统?没有循环。
没有循环的另一个原因是你无论如何都没有将self
传递给动画系统。你通过了self.view.layoutIfNeeded
。在Swift中,这相当于:
UIView.layoutIfNeeded(self.view)
你没有在这里传递self
。你正在传递一个观点。现在动画系统几乎肯定将保持对该视图的引用,直到动画完成,但这没关系。那还不是一个循环。
答案 1 :(得分:1)
没有引用周期,因为self
没有捕获闭包,但如果你不想要另一个强引用self
,你可以使用包装闭包。
如果您确定在接下来的0.3秒内未self
取消分配,则可以使用unowned
,否则weak
。 (我会使用weak
来确保它不会崩溃)