我有一个时间敏感的代码段,用于存储,检索和替换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类。即使我开始创建自己的类,这实际上会更快,并且需要更少的分配我当前的代码吗?
答案 0 :(得分:0)
我使用
@()
包装器运算符创建一个NSNumber,我认为必须将其复制到堆中以存储在字典中。
这是正确的。
我认为用C替换对象的原语很容易:
这也是正确的。不幸的是,由于NSNumber
是不可变的,因此您需要编写自己的SomeMutableIntClass
。
即使我开始创建自己的类,这实际上会更快,并且需要更少的分配我当前的代码?
添加可变性可能会有所帮助,但答案取决于您在可变字典中存储的值。如果你一遍又一遍地存储相同的数字,你可能会获得包装器的缓存实例,而无需额外的分配。
注意:您当前的程序假定所有键都将出现在词典中。如果不是这样,您需要在nil
方法中添加oldValue
setInt:
次检查。