如何替换NSMutableDictionary中的整数值?

时间:2014-08-05 17:00:45

标签: objective-c performance int nsmutabledictionary alloc

我有一个时间敏感的代码段,用于存储,检索和替换NSMutableDictionary中的值。问题是我需要存储对象而不是基元,并且需要在堆上分配对象。但是,一旦在字典中存在一个对象并且我想要替换该值,而不是分配另一个数字,我不能用新的int替换当前的堆文字,无论它在哪里?

问题是,我一直在存储NSNumbers,因为they are immutable我无法更改NSNumber的值。

目前,我使用@()包装器运算符来创建一个NSNumber,我认为必须将其复制到堆中以存储在字典中。

-(void)setInt: (int)value For: (NSString *)key {
    [self.dictionary setValue:@(value) forKey:key];
}

我认为用C替换对象的原语很容易:

-(void)setInt: (int)value For: (NSString *)key {
    SomeMutableIntClass * oldValue;
    oldValue = (SomeMutableIntClass *) [self.dictionary objectForKey:key];
    oldValue.int = value; // Direct copy like a pointer since int is primitive
}

我想知道我是否应该使用一个int属性创建一个Integer类。即使我开始创建自己的类,这实际上会更快,并且需要更少的分配我当前的代码吗?

1 个答案:

答案 0 :(得分:0)

  

我使用@()包装器运算符创建一个NSNumber,我认为必须将其复制到堆中以存储在字典中。

这是正确的。

  

我认为用C替换对象的原语很容易:

这也是正确的。不幸的是,由于NSNumber是不可变的,因此您需要编写自己的SomeMutableIntClass

  

即使我开始创建自己的类,这实际上会更快,并且需要更少的分配我当前的代码?

添加可变性可能会有所帮助,但答案取决于您在可变字典中存储的值。如果你一遍又一遍地存储相同的数字,你可能会获得包装器的缓存实例,而无需额外的分配。

注意:您当前的程序假定所有键都将出现在词典中。如果不是这样,您需要在nil方法中添加oldValue setInt:次检查。