当不在闭包中时,传递属于 self 的函数是否会导致保留循环?

Does passing a function belonging to self cause a retain cycle when not in a closure?

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

如果我直接传递属于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?"的引用在哪里说得清楚一点,即使动画系统引用了selfself又如何引用动画系统呢?没有循环。

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

UIView.layoutIfNeeded(self.view)

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