Swift保留周期和闭包
我曾尝试对理解保留周期进行大量研究。 我似乎无法在我的例子中找到任何东西。 我知道如果我将一个属性设置为一个闭包,那么就会发生一个保留周期,需要使用弱或无主。 但我有2个例子,我想知道它们是否正确完成:在此先感谢,我已经尝试过查看它们是否已经在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
,但我认为swift很荒谬,并试图“乐于助人”。 另外,我不确定你需要在动画期间调用self.setNeedsDisplay()
,因为它应该自己做…