Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么NSNotificationCenter可以使用强引用循环,而UIView.animateWithDuration不能使用?_Ios_Swift_Automatic Ref Counting_Strong References - Fatal编程技术网

Ios 为什么NSNotificationCenter可以使用强引用循环,而UIView.animateWithDuration不能使用?

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块,我必须使用[unowned self]来避免强引用循环:

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我提供的答案只突出了通知中心的一个问题。真正的原因是,你想避免建立一个强大的参考周期,我更新了我的答案,以反映这一点