ios - Swift 保留循环和闭包

标签 ios swift retain-cycle

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

最佳答案

这些都不会创建保留循环,因为该 block 未附加到 self。此外,具有保证生命周期的保留周期并不是世界上最糟糕的事情。

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


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

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

这会创建一个保留循环,因为 selfself 持有引用的 block 中被引用(不是弱引用)。


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

这不会创建一个保留周期,因为 animations block 被发送到系统——您的 UIView 子类不持有对该 block 的引用。


旁注:您不需要在结束时有一个return,但我想swift 是荒谬的,并且试图“提供帮助”。另外,我不确定您是否需要在动画期间调用 self.setNeedsDisplay(),因为它应该自己执行...

关于ios - Swift 保留循环和闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935149/

相关文章:

ios - Xcode 调试器 : fatal error: Array index out of range. 。为什么?

ios - UIButton 的出现和消失

ios - 在 iOS 9 的 alert.addAction 中按下 OK 时如何打开另一个 View Controller

ios - 在 CollectionView 中执行批量更新时不会释放内存

ios - 为什么 Swift ARC 不首先中断属性引用以防止保留循环?

swift - 为什么Operation Queue中不需要[weak self]或[unowned self]?

android - OpenGL ES 2.0 : Filling in a Sphere instead of it being wireframe

ios - 访问 childAutoID 以更新 Firebase 中选定的子值

ios - SwiftUI NavigationLink isActive 绑定(bind)未更新/工作

ios - Xcode 和 Cocoapods "No such module"错误