Ios 为什么NSNotificationCenter可以使用强引用循环,而UIView.animateWithDuration不能使用?
对于NSNotificationCenter块,我必须使用[unowned self]来避免强引用循环:Ios 为什么NSNotificationCenter可以使用强引用循环,而UIView.animateWithDuration不能使用?,ios,swift,automatic-ref-counting,strong-references,Ios,Swift,Automatic Ref Counting,Strong References,对于NSNotificationCenter块,我必须使用[unowned self]来避免强引用循环: NSNotificationCenter.defaultCenter() .addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: nil, usingBlock: { [unowned self] (notificatio
NSNotificationCenter.defaultCenter()
.addObserverForName(UIApplicationWillEnterForegroundNotification,
object: nil,
queue: nil,
usingBlock: { [unowned self] (notification : NSNotification!) -> Void in
self.add(123)
})
但是,在UIView.animateWithDuration中,我不必使用[unowned self]:
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.someOutlet.alpha = 1.0
self.someMethod()
})
区别是什么?UIView动画的动画:()->Void
和完成:((Bool)->Void)?
块不保留对self的引用。之前的这篇文章对这个话题提供了很多信息
通知块
(NSNotification)->Void
确实保留了对self的引用,在您的情况下,通过将其作为无主传入,它不应增加保留计数。我试图确保在传递给闭包的任何引用上使用unowned或weak。这里有一篇关于这个的帖子
但是,我强烈建议不要使用通知,尤其是块,因为这篇文章可能指出了一个错误,当我读到它时,这是令人震惊的 UIView动画的
动画:()->Void
和完成:((Bool)->Void)?
块不保留对self的引用。之前的这篇文章对这个话题提供了很多信息
通知块
(NSNotification)->Void
确实保留了对self的引用,在您的情况下,通过将其作为无主传入,它不应增加保留计数。我试图确保在传递给闭包的任何引用上使用unowned或weak。这里有一篇关于这个的帖子
但是,我强烈建议不要使用通知,尤其是块,因为这篇文章可能指出了一个错误,当我读到它时,这是令人震惊的
动画块和通知中心块之间的唯一区别在于动画块的寿命非常短,它会立即执行,然后释放 在这两种情况下,块将捕获
self
;但是只有NSNotificationCenter
代码有问题,因为通知中心将无限期地保留对块的引用,因为通知可以随时发生
请注意,这与循环引用不同。循环引用通常由对象创建,对象持有对捕捉自身的块的引用,如下所示:
self.myBlock = {
self.doSomething()
}
循环引用意味着
self
永远不会被释放。通知中心不是循环引用(因为self不持有对通知中心的引用),它只是一个常规引用,将一直保持到移除观察者为止。动画块和通知中心块之间的唯一区别是动画块的寿命非常短,它会立即执行,然后释放
在这两种情况下,块将捕获self
;但是只有NSNotificationCenter
代码有问题,因为通知中心将无限期地保留对块的引用,因为通知可以随时发生
请注意,这与循环引用不同。循环引用通常由对象创建,对象持有对捕捉自身的块的引用,如下所示:
self.myBlock = {
self.doSomething()
}
循环引用意味着
self
永远不会被释放。通知中心不是一个循环引用(因为self没有保存对通知中心的引用),它只是一个常规引用,将一直保存到移除观察者为止。哇,这太疯狂了,所以,这仅仅是因为一个可可虫,我不得不这么做?@Truman1我提供的答案只突出了通知中心的一个问题。真正的原因是,为了避免创建一个强引用循环,我更新了我的答案,以反映Whoa这太疯狂了,所以这只是因为一个Cocoa bug,我必须这样做?@Truman1我提供的答案只突出了通知中心的一个问题。真正的原因是,你想避免建立一个强大的参考周期,我更新了我的答案,以反映这一点