Swift保留周期和闭包

时间:2014-11-14 16:59:58

标签: ios swift retain-cycle

我尝试过很多关于理解保留周期的研究。我似乎无法在我的例子中找到任何东西。我知道如果我将一个属性设置为一个闭包,那么就会发生一个保留周期,需要使用弱或无主。但是我有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)
}

在这两个示例中,selfUIView的子类。我只是想知道我正在做的,或者我是否应该使用imageView作为弱引用。感谢。

1 个答案:

答案 0 :(得分:2)

由于该块未附加到self,因此这些都不会创建保留周期。此外,保证寿命的保留周期并不是世界上最糟糕的事情。

让我们考虑一些例子。 (抱歉,我的快速并不是特别强大,所以我将恢复到obj-c。)


- (void)doSomething:(void(^)())block {
  self.block = block;
}

// elsewhere
  [self doSomething:^{
    self.someProperty = 5;
  }];

这会创建一个保留周期,因为selfself拥有引用的块中被引用(而不是弱)。


[UIView transitionWithView:self duration:5, options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
  [self setNeedsDisplay];
} completion:nil];

这不会创建保留周期,因为animations块被发送到系统 - 您的UIView子类不会保留对块的引用。


旁注:你不应该在关闭结束时拥有return,但我认为swift很荒谬并试图成为"有用的& #34 ;.另外,我不确定你是否需要在动画期间调用self.setNeedsDisplay(),因为它应该自己做...