2009-01-08 70 views
18

任何人都可以澄清/澄清有關-[NSNotificationCenter addObserver:selector:name:object:]的情況嗎?NSNotificationCenter爲觀察者和對象提供什麼類型的參考?

  • 'observer'和'object'參數的通知中心保存了哪些類型的引用?

  • 從通知中心刪除觀察員的最佳做法是什麼?

  • 多線程應用程序有什麼特別的問題,特別是關於'對象'參數?

  • 此方法在GC和非GC環境中的行爲有什麼區別?

  • 這種方法的行爲在移動和桌面環境之間有什麼顯着差異(從客戶角度來看)?

另外,任何指向現有文章涵蓋這一點將不勝感激。我谷歌搜索,但很驚訝地發現深入討論這些問題(雖然也許我沒有使用正確的魔術關鍵字)。

+0

thx爲編輯chris。 – 2009-01-08 22:20:57

回答

24

什麼類型的引用是由 的 「觀察員」和「對象」參數的通知中心保持?

我相信一個很弱的參考,雖然這只是從記憶(沒有雙關語意圖)。

從 通知中心刪除觀察員的最佳做法是什麼?

始終從通知中心刪除已註冊的對象,然後才能發佈。如果它自己設置了註冊,或者當另一個對象管理通知訂閱時釋放它,那麼該對象的dealloc方法對此很好。記住這一點,以上內容無關緊要。

什麼是 多線程應用程序的特殊關注,尤其是 的WRT「對象」的說法?

如果您發送從後臺線程的通知NSNotificationCenter工作在一線,精細,對象將收到該同一線程。由於這種行爲,如果您正在更新UI或執行其他任何不是線程安全的操作(或者從主線程中的另一個方法派發通知),則應該使用不同的方法。

該方法在GC和非GC 環境中的行爲 有什麼區別?

我不記得任何你需要擔心的事情,儘管我還沒有用過GC。

在 此方法的行爲 移動和桌面環境之間的任何差別顯著 (從客戶角度)?

不是我聽說過的,沒有。當您註冊對象時,您可以選擇註冊所有通知或僅註冊來自某個對象的通知。如果你大量使用通知,後者可能會更快一些,但總是測試確定。

此外,覆蓋這對現有 物品任何指針將是 不勝感激。我GOOGLE了,但 很驚訝地發現這些問題的討論很少深入 (雖然 也許我沒有使用正確的魔術 關鍵字)。

我認爲這更多是因爲NSNotificationCenter一般來說非常易於使用。如果你擔心某些情況,不要害怕編寫一個快速測試應用程序!

+1

特別是在GC下使用NSNotificationCenter時,您不需要發出removeObserver:消息,並且當您的對象完成時,中心對它的任何引用都將被清零。 – 2009-01-09 00:08:25

8

現狀在2016年

iOS 9 has changedNSNotificationCenter,使得弱引用目標對象。

這也就是說你不再需要在removeObserver的時候對象是dealloc。

相關問題