我尝试做很多研究来理解保留周期。但我似乎在我的例子中找不到任何东西。我确实知道,如果我将属性设置为闭包,则会发生保留周期,并且需要使用弱或无主。但我有两个例子,我想知道它们是否正确完成:提前致谢,我已经尝试查看它们是否已经在 stackoverflow 上,但找不到任何内容。
简单的动画
UIView.transitionWithView(self, duration: 5, options: .TransitionCrossDissolve, animations: { [weak self] in
self?.setNeedsDisplay()
return
}, completion: nil)
带有数组的动画
for imageView in self.townImages {
UIView.transitionWithView(imageView, duration: 0.3, options: .TransitionCrossDissolve, animations: { () -> Void in
imageView.image = UIImage(named: self.getImages()[count++])
}, completion: nil)
}
在这两个例子中self
是一个子类UIView
。我只是想知道我做得是否正确,或者我是否也应该使用 imageView 作为弱引用。谢谢。
这些都不会创建保留循环,因为该块未附加到self
。此外,具有保证寿命的保留周期并不是世界上最糟糕的事情。
让我们考虑一些例子。(抱歉,我的 swift 不是特别强,所以我要恢复到 obj-c。)
- (void)doSomething:(void(^)())block {
self.block = block;
}
// elsewhere
[self doSomething:^{
self.someProperty = 5;
}];
这会创建一个保留周期,因为self
在块内被引用(不是弱引用)self
持有参考。
[UIView transitionWithView:self duration:5, options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
[self setNeedsDisplay];
} completion:nil];
这不会创建保留周期,因为animations
块被发送到系统——你的UIView
子类不保存对该块的引用。
边注: 你不应该需要return
在你关闭结束时,但我想斯威夫特很荒谬,并试图“提供帮助”。另外,我不确定你是否需要打电话self.setNeedsDisplay()
在动画期间,因为它应该自己做......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)