当不在闭包中时,传递属于 self 的函数是否会导致保留循环?
Does passing a function belonging to self cause a retain cycle when not in a closure?
如果您需要在闭包内部引用 self
,最好将其作为 weak
或 unowned
传递以防止循环保留。
如果我直接传递属于self
的函数,会不会造成retain cycle?或者它是否需要嵌套在闭包中以削弱自我?
直接通过
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
只是为了确保它不会崩溃)
这不应该创建引用循环,但即使它创建了也没关系。引用循环只会存在到动画完成之前,此时它会被打破。创建短期引用循环实际上是有益的,因为它确保目标在调用的生命周期内继续存在。周期本身并不是问题。 坚不可摧 循环是问题所在。
这不会产生循环的原因有两个。首先,没有 "cycle." 系统将引用 something(稍后会详细介绍),当然。但是"the thing that is referencing that something?"的引用在哪里说得清楚一点,即使动画系统引用了self
,self
又如何引用动画系统呢?没有循环。
没有循环的另一个原因是您没有将 self
传递给动画系统。你的路过self.view.layoutIfNeeded
。在 Swift 中,这相当于:
UIView.layoutIfNeeded(self.view)
你没有超过 self
这里。你正在传递一个观点。现在几乎可以肯定,动画系统 将 持有对该视图的引用,直到动画完成,但这没关系。那还不是一个循环。
如果您需要在闭包内部引用 self
,最好将其作为 weak
或 unowned
传递以防止循环保留。
如果我直接传递属于self
的函数,会不会造成retain cycle?或者它是否需要嵌套在闭包中以削弱自我?
直接通过
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
只是为了确保它不会崩溃)
这不应该创建引用循环,但即使它创建了也没关系。引用循环只会存在到动画完成之前,此时它会被打破。创建短期引用循环实际上是有益的,因为它确保目标在调用的生命周期内继续存在。周期本身并不是问题。 坚不可摧 循环是问题所在。
这不会产生循环的原因有两个。首先,没有 "cycle." 系统将引用 something(稍后会详细介绍),当然。但是"the thing that is referencing that something?"的引用在哪里说得清楚一点,即使动画系统引用了self
,self
又如何引用动画系统呢?没有循环。
没有循环的另一个原因是您没有将 self
传递给动画系统。你的路过self.view.layoutIfNeeded
。在 Swift 中,这相当于:
UIView.layoutIfNeeded(self.view)
你没有超过 self
这里。你正在传递一个观点。现在几乎可以肯定,动画系统 将 持有对该视图的引用,直到动画完成,但这没关系。那还不是一个循环。