NSNotificationCenter使用多少内存

时间:2014-10-09 14:24:28

标签: ios objective-c iphone 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用于三个不同的事情。所以我的好奇心

2 个答案:

答案 0 :(得分:3)

你的问题有点不清楚。如果您的意思是"拨打[NSNotificationCenter defaultCenter]需要多长时间?",请不要担心。这是微不足道的。通常人们会将[NSNotificationCenter defaultCenter]卸载到变量中以节省输入。我通常称变量为nc,因为它太长了。此答案的其余部分与NSNotification表现有关,这可能不是您所要求的。

可可通常不会对这些事情做出承诺。您不能依赖于实施细节,遗憾的是,CFNotificationCenter不是Core Foundation开源版本的一部分,因此您无法查看它当前的情况实现。

但经验表明(基于几年前我必须做的性能调整),它被实现为一系列观察。因此它存储观察者,选择器,名称和对象,这需要大约4x(指针大小)内存加上可能是ObjC结构开销。所以在64位平台上可能有20多个字节等。

addObserverremoveObserver大致相当于向NSMutableArray添加或删除条目的成本(特别是removeObserver是总数为O(n)在该中心登记的观察数量)。发布通知的是中心登记的观察总数的O(n)。 (同样,这是基于逆向工程;它可能会随着时间的推移而改变,但我严重怀疑它。我现在确定这是非常稳定的代码。)

这意味着NSNotification无法很好地扩展到成千上万的观察。这并不是说您出于性能原因而应该避免NSNotification。" (我讨厌人们说这样的事情而没有真正根据他们的情况进行验证。)这只是意味着你需要在系统中创建数百或数千个通知之前要深思熟虑。这就是KVO专门设计的目标。

对于您的特定示例,这正是NSNotification的设计目标,因此您应该使用它。

答案 1 :(得分:1)

Objective-C是dynamic dispatch语言。这意味着消息notification is at the core of Cocoa。您不必担心使用了多少内存。请注意,当您添加观察者时,请确保将其删除。