2017-10-05 38 views
0

假設我們有一個給定的Swift類。在Swift Struct中刪除NotificationCenter Observer的最佳位置

class Test { 
    init() { 
     NotificationCenter.default.addObserver(...) 
    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 
} 

在一個類中,你可以使用deinit生命週期的方法來刪除NotificationCenter觀察者。在一個結構中,沒有deinit方法。因此我的問題是,有人會在結構中刪除NotificationCenter觀察者?或者可能,我們不必刪除結構體中的觀察者嗎?

+0

您可以讓結構保留對類的引用。當在類上調用'dealloc'時,您知道結構已被釋放。 – JAL

回答

3

從iOS的9以上,這是沒有必要刪除NotificationCenter觀察員他們自動刪除

如果您擔心無論如何都被卡在內存中,您應該從處理結構的類中調用remove方法。

0

您不能在NotificationCenter中將結構註冊爲觀察者。當您使用addObserver(_:selector:name:object:)方法時,您必須通過Selector作爲參數。選擇器必須是一個用@objc標記的功能,您只能在類中使用它。

在涉及到類時,您可以在問題中提到的deinit方法中取消註冊觀察者。但是,自iOS 9開始,您不必手動刪除觀察者,因爲此版本NSNotificationCenter存儲對觀察者的弱引用。 刪除觀察員不會自動爲您完成。

根據release notes

NSNotificationCenter和NSDistributedNotificationCenter不再向可能被釋放的註冊觀察者發送通知。如果觀察者能夠作爲歸零弱引用存儲,則底層存儲將觀察者存儲爲歸零弱引用。或者,如果對象不能被弱存儲(因爲它有一個自定義的保留/釋放機制,會阻止運行庫弱存儲對象),該對象被存儲爲一個非弱的歸零引用。這意味着觀察員不需要在他們的解除分配方法中取消註冊。