2014-03-25 124 views
1

我使用下面的行添加一个观察者:NSNotificationCenter - 观察反对时去除观察者被释放

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

我的观察者(self)将永远不会被释放。

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

发生这种情况时,对于我的观察者作为观察者的状态会发生什么?我需要做些什么来停止观察解除分配的对象,就像KVO所需要的那样?或者我会继续观察self.playerItem处的新对象吗?或者我的观察员会自动“未注册?”

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

回答

3

按照NSNotificationCenter class reference

一定要调用removeObserver:或removeObserver:名称:对象: notificationObserver之前或 的addObserver指定的任何对象:选择:名称:对象:被释放。

因此:您应该在取消分配self.playerItem之前取消注册您的观察者。

但是,当用户开始播放不同的项目,老 self.playerItem将被释放---但将始终与 更换一个新的,这是我要继续观察。

您可以通过niladdObserver:selector:name:object:方法的最后一个参数:

将带有一个观察者,通知选择器和标准的条目到接收器的调度表:通知名称和发件人。 如果您未指定

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

因此,您将收到任何发布它的对象的通知AVPlayerItemDidPlayToEndTimeNotification

+0

酷,所以我可以指定对象:无,然后我就不用担心以往删除观察者。谢谢! – mkc842

+0

不是。当您对进一步的通知处理不感兴趣时​​,您仍然应该删除观察者。但是你可能只做一次而不是为每个项目注销/ registerint。 –

2

由于iOS的9它不再需要从一个对象中删除的观察者:

在OS X 10.11和iOS 9.0 NSNotificationCenter和NSDistributedNotificationCenter将不再发送通知到可以被解除分配注册观察员。

然而,基于块的观察员需要是未注册为前:经由

基于块的观察员 - [NSNotificationCenter addObserverForName:对象:队列:usingBlock]方法仍然需要未注册因为该系统仍然对这些观察员有强烈的参考意义,因此不再使用。

更多信息可以在这里找到:

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

相关问题