2014-10-09 87 views
1

什麼是存儲/處理的使用情況時使用一個,我將有:多少內存的NSNotificationCenter使用

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(dismissKeyboard) name:UIKeyboardWillHideNotification object:nil]; 

或者:

NSNotificationCenter * notificationCenter = 
[notificationCenter addObserver:self selector:@selector(dismissKeyboard) name:UIKeyboardWillHideNotification object:nil]; 

PS:我想到的使用NSNotificationCenter來做三件事情。所以我的好奇心

+0

您想知道當您將觀察者添加到通知中心時,您的應用程序正在使用多少內存? – 2014-10-09 14:43:32

+0

是的。如果通知中心將使用我的很多硬件 – Gian 2014-10-09 14:45:19

+0

我相信內存和處理器的時間消耗將遠遠小於從資源加載映像時的時間消耗。這不是你應該擔心的事情。 – medvedNick 2014-10-09 14:53:21

回答

3

你的問題有點不清楚。如果您的意思是「需要多少時間致電[NSNotificationCenter defaultCenter]?」,請不要擔心。這是微不足道的。通常人們將[NSNotificationCenter defaultCenter]卸載到變量中以保存輸入。我通常稱這個變量爲nc,因爲它太長了。這個答案的其餘部分與NSNotification的表現有關,這可能不是你要求的。

可可一般不會對這些東西作出承諾。您不能依賴實現細節,但不幸的是,CFNotificationCenter不是Core Foundation的開源版本的一部分,因此您無法查看它是如何實現的。

但是經驗表明(基於幾年前我不得不做的性能調整)它被實現爲一系列的觀察值。因此它存儲觀察者,選擇器,名稱和對象,這需要大約4倍(指針大小)的內存以及可能的ObjC結構開銷。所以在64位平臺上可能有20多個字節或類似的東西。

addObserverremoveObserver是大致相當於添加或移除到NSMutableArray的條目的成本(具體地,removeObserver爲O(n)與所述中心註冊觀測的總數目)。在中心註冊的觀測總數中發佈通知是O(n)。 (同樣,這是基於逆向工程,它可以隨時間變化,但我認真地懷疑它,我相信這是非常穩定的代碼)

這意味着NSNotification不能很好地擴展到數千觀察結果。這並不是說您出於性能考慮應該「避免NSNotification」。 (我討厭人們說這樣的事情,而沒有根據他們的情況實際驗證它。)這隻意味着你需要在系統中創建數百或數千個通知之前進行深思熟慮。這就是KVO專門設計的。

對於您的特定示例,這正是NSNotification的設計目的,因此您應該使用它。

+0

非常感謝@Rob Napier,你明確了我想知道的內容。 – Gian 2014-10-09 16:46:13