6

我试图做很多关于理解保留周期的研究。不过,我似乎在我的例子中找不到任何东西。我确实知道,如果我将属性设置为闭包,则会发生保留周期并且需要使用弱或无主。但是我有 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 作为弱参考。谢谢。

4

1 回答 1

3

这些都不会创建保留周期,因为该块未附加到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在关闭结束时使用 a ,但我认为 swift 是荒谬的,并试图“提供帮助”。另外,我不确定您是否需要self.setNeedsDisplay()在动画期间调用,因为它应该自己这样做......

于 2014-11-14T17:10:27.700 回答