我使用以下行添加观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying) name:AVPlayerItemDidPlayToEndTimeNotification object:self.playerItem];
我的观察员(self
)永远不会被解除分配。
但是当用户开始播放不同的项目时,旧的self.playerItem
将被取消分配---但总是会被新的替换,我想继续观察。
当发生这种情况时,我观察者作为观察者的身份会发生什么?我是否需要做一些事情来停止观察解除分配的物体,就像KVO所要求的那样?或者我会继续在self.playerItem
观察新对象吗?或者我的观察者会自动被取消注册吗?"
如果我需要删除观察者,我想知道为什么没有相应的removeObserver
方法可以指定一个选择器;我似乎只能通过removeObserver:(id)notificationObserver
批发移除观察者。
答案 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]方法仍然需要在不再使用时取消注册,因为系统仍然拥有对这些观察者的强引用。
可在此处找到更多信息: