2016-09-23 54 views
4

在閱讀了iOS 9的this後,我知道你不需要刪除Observer了。爲什麼你必須刪除ios8中的觀察者?

但是對於iOS 8,您neededremoveObserver中的viewController的deinit方法。 但我無法理解它。如果viewController被釋放,那麼它的DEAD不是?爲什麼我們需要做一個removeObserver。它是一個觀察者,就像呼喚一個永遠不會拿起手機的死者一樣

我不理解什麼?

+3

因爲發送消息到釋放實例會崩潰應用程序... –

回答

9

這是你鏈接的文章中充分說明:

通知中心現在保持一個零參考觀察者:

如果觀察者能夠被存儲爲歸零弱引用底層存儲將存儲觀察者作爲歸零弱引用,或者如果對象不能被弱存儲(即它有一個自定義的保留/釋放機制,將阻止運行庫弱存儲該對象),它會將對象存儲爲一個非弱的調零參考。

此前的iOS 9,NSNotificationCenter沒有使用weak參考,因此NSNotificationCenter不知道目標已經實現釋放。它盲目地將通知發送給任何已註冊的目標。如果目標已被釋放,這很糟糕(可能會崩潰)。因此需要始終取消註冊。

在iOS 9中,NSNotificationCenter開始使用弱引用。這意味着它現在知道是否有一個註冊目標已被釋放。這意味着它不再嘗試發送通知到釋放目標。這意味着您不再需要在釋放目標之前明確註銷目標。

4

它作爲一個觀察者很像調用一個死去的人誰不會拿起電話

沒錯!

在這種情況下,您的電話號碼是內存地址,一旦通知中心嘗試呼叫觀察者,該內存地址將被取消引用。現在,一旦視圖控制器被釋放,你期望在這個內存地址上有什麼?我們無法知道。

但是你肯定不想調用一個方法(這就是通知中心所做的),這個方法可能不再存在,甚至已經被完全不同的東西(例如圖像)所取代。

添加一個真實世界的例子:它更像是依賴於你的汽車(視圖控制器)在車庫中的特定位置(內存地址)。你絕對依靠你的車在那裏,所以當你想進入時你甚至不會去看它是否在那裏。現在,假裝有人刪除(釋放)你的車,但你仍然依靠它。進入並坐在不再存在的汽車中肯定會是一次痛苦的經歷。