NSNotificationCenter 使用了多少内存

Gia*_*ian 2 iphone objective-c nsnotificationcenter ios

使用一个时我将使用的内存/处理是什么:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(dismissKeyboard) name:UIKeyboardWillHideNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

或者:

NSNotificationCenter * notificationCenter = 
[notificationCenter addObserver:self selector:@selector(dismissKeyboard) name:UIKeyboardWillHideNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

PS:我想到用NSNotificationCenter三个不同的东西。所以我的好奇心

Rob*_*ier 6

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

可可通常不会对这些事情做出承诺。你不能依赖实现细节,不幸的CFNotificationCenter是,它不是 Core Foundation 开源版本的一部分,所以你不能四处看看它目前是如何实现的。

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

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

这意味着NSNotification不能很好地扩展到数千个观察。这并不是建议您“NSNotification出于性能原因而避免”。(我讨厌人们在没有针对他们的情况进行实际验证的情况下说出这样的话。)这只是意味着在系统中创建数百或数千个通知之前,您需要深思熟虑。这就是 KVO 专门设计的。

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