NSNotificationCenter - 在观察到被反对者时取消分配观察者

时间:2014-03-25 19:12:17

标签: ios nsnotificationcenter

我使用以下行添加观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];

我的观察员(self)永远不会被解除分配。

但是当用户开始播放不同的项目时,旧的self.playerItem将被取消分配---但总是会被新的替换,我想继续观察。

当发生这种情况时,我观察者作为观察者的身份会发生什么?我是否需要做一些事情来停止观察解除分配的物体,就像KVO所要求的那样?或者我会继续在self.playerItem观察新对象吗?或者我的观察者会自动被取消注册吗?"

如果我需要删除观察者,我想知道为什么没有相应的removeObserver方法可以指定一个选择器;我似乎只能通过removeObserver:(id)notificationObserver批发移除观察者。

2 个答案:

答案 0 :(得分:3)

根据NSNotificationCenter class reference

  

请务必调用removeObserver:或removeObserver:name:object:   在notificationObserver或指定的任何对象之前   addObserver:selector:name:object:is deallocated。

所以:你应该在self.playerItem解除分配之前注销你的观察者。

  

但是当用户开始播放不同的项目时,旧的   self.playerItem将被释放 - 但将始终被替换为   一个新的,我想继续观察。

您可以将nil作为addObserver:selector:name:object:方法的最后一个参数传递:

  

使用观察者,通知选择器和可选条件向接收者的调度表添加条目:通知名称和发件人。   如果您没有指定

     

如果您通过nil,通知中心不会使用通知的发件人来决定是否将其发送给观察者。

因此,您将从发布该帖子的任何对象收到通知AVPlayerItemDidPlayToEndTimeNotification

答案 1 :(得分:2)

从iOS 9开始,不再需要从对象中删除观察者:

  

在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能已解除分配的已注册观察者发送通知。

但是,基于块的观察者需要像以前一样取消注册:

  

基于块的观察者通过 - [NSNotificationCenter addObserverForName:object:queue:usingBlock]方法仍然需要在不再使用时取消注册,因为系统仍然拥有对这些观察者的强引用。

可在此处找到更多信息:

https://developer.apple.com/library/content/releasenotes/Foundation/RN-FoundationOlderNotes/index.html#10_11NotificationCenter