[swift]为什么是一个强引用循环可能与 NSNotificationCenter 但不是 UIView.animateWithDuration?

标签: ios Swift
发布时间: 2017/3/6 23:08:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

与 NSNotificationCenter 块,我必须使用 [无主的自我] 为避免强引用循环︰

NSNotificationCenter.defaultCenter()
    .addObserverForName(UIApplicationWillEnterForegroundNotification,
        object: nil,
        queue: nil,
        usingBlock: { [unowned self] (notification : NSNotification!) -> Void in
            self.add(123)
        })

然而,在 UIView.animateWithDuration,我不需要使用 [无主的自我]:

   UIView.animateWithDuration(0.5, animations: { () -> Void in
      self.someOutlet.alpha = 1.0
      self.someMethod()
   })

区别是什么?

解决方法 1:

动画块和通知中心块之间的唯一区别是动画块是极短住 — — 它是立即执行,然后释放。

在这两种情况下,块将捕获 self ; 但只有 NSNotificationCenter 代码是有问题的因为通知中心将无限期对块的引用,因为通知可以发生在任何时间。

请注意,这是不同于一个循环引用。循环引用经常创建的对象,该对象保存到捕获自我,像这样的块的引用︰

self.myBlock = {
   self.doSomething()
}

循环引用意味着 self 从未将释放。通知中心不是一个循环引用 (因为自我不住对通知中心的引用),它是经常引用,直到删除观察员将举行。

官方微信
官方QQ群
31647020