为什么你必须删除 ios8 中的观察者?
why do you have to remove observer in ios8?
阅读 this post for iOS 9 后,我知道您不再需要删除 Observer。
但是对于 iOS 8,您 needed 在 viewController 的 deinit
方法中 removeObserver。
但我无法理解它。如果 viewController 被释放,那么它是 DEAD 不是吗?为什么我们需要做一个 removeObserver。做一个旁观者就好比叫一个永远不会捡起的死人phone
我哪里不明白?
您链接的文章中对此进行了全面解释:
The notification center now keeps a zeroing reference to the observer:
If the observer is able to be stored as a zeroing-weak reference the underlying storage will store the observer as a zeroing weak reference, alternatively if the object cannot be stored weakly (i.e. it has a custom retain/release mechanism that would prevent the runtime from being able to store the object weakly) it will store the object as a non-weak zeroing reference.
在 iOS 9 之前,NSNotificationCenter
未使用 weak
引用实现,因此 NSNotificationCenter
不知道目标已被释放。它盲目地向任何已注册的目标发送通知。如果目标已被解除分配,这很糟糕(可能会崩溃)。因此需要始终取消注册。
在 iOS 9 中,NSNotificationCenter
开始使用弱引用。这意味着它现在知道注册目标之一是否已被解除分配。这意味着它不再尝试向解除分配的目标发送通知。这意味着您不再需要在释放目标之前显式注销目标。
It being an observer is much like calling a dead person who will never pick up the phone
完全正确!
你的 phone 号码在这种情况下是一个内存地址,一旦通知中心试图调用观察者,它就会被取消引用。现在,一旦 View Controller 被释放,您希望这个内存地址是什么?我们无法知道。
但是您肯定不想在一个对象上调用一个方法(这就是通知中心所做的),该对象可能不再存在,甚至已经被完全不同的东西(例如图像)取代。
添加一个真实世界的例子:这更像是依赖你的车(视图控制器)在车库的特定位置(内存地址)。你绝对依赖你的车在那里,所以当你想上车时你甚至不看它是否在那里。现在,假装有人搬走(解除分配)你的车,但你仍然依赖它在那里。坐进一辆已经不存在的车里肯定是一种痛苦的经历。
阅读 this post for iOS 9 后,我知道您不再需要删除 Observer。
但是对于 iOS 8,您 needed 在 viewController 的 deinit
方法中 removeObserver。
但我无法理解它。如果 viewController 被释放,那么它是 DEAD 不是吗?为什么我们需要做一个 removeObserver。做一个旁观者就好比叫一个永远不会捡起的死人phone
我哪里不明白?
您链接的文章中对此进行了全面解释:
The notification center now keeps a zeroing reference to the observer:
If the observer is able to be stored as a zeroing-weak reference the underlying storage will store the observer as a zeroing weak reference, alternatively if the object cannot be stored weakly (i.e. it has a custom retain/release mechanism that would prevent the runtime from being able to store the object weakly) it will store the object as a non-weak zeroing reference.
在 iOS 9 之前,NSNotificationCenter
未使用 weak
引用实现,因此 NSNotificationCenter
不知道目标已被释放。它盲目地向任何已注册的目标发送通知。如果目标已被解除分配,这很糟糕(可能会崩溃)。因此需要始终取消注册。
在 iOS 9 中,NSNotificationCenter
开始使用弱引用。这意味着它现在知道注册目标之一是否已被解除分配。这意味着它不再尝试向解除分配的目标发送通知。这意味着您不再需要在释放目标之前显式注销目标。
It being an observer is much like calling a dead person who will never pick up the phone
完全正确!
你的 phone 号码在这种情况下是一个内存地址,一旦通知中心试图调用观察者,它就会被取消引用。现在,一旦 View Controller 被释放,您希望这个内存地址是什么?我们无法知道。
但是您肯定不想在一个对象上调用一个方法(这就是通知中心所做的),该对象可能不再存在,甚至已经被完全不同的东西(例如图像)取代。
添加一个真实世界的例子:这更像是依赖你的车(视图控制器)在车库的特定位置(内存地址)。你绝对依赖你的车在那里,所以当你想上车时你甚至不看它是否在那里。现在,假装有人搬走(解除分配)你的车,但你仍然依赖它在那里。坐进一辆已经不存在的车里肯定是一种痛苦的经历。