【问题标题】:How to replace a value of an integer in an NSMutableDictionary?如何替换 NSMutableDictionary 中的整数值?
【发布时间】:2014-09-28 10:41:34
【问题描述】:

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

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

目前,我使用@() 包装运算符创建一个 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 类。即使我开始制作自己的课程,这实际上会更快并且需要更少的分配我当前的代码吗?

【问题讨论】:

  • 正确。您的解决方案将“更快”。但它可能不会让您的程序对用户来说明显更快——只有分析可以显示这一点。

标签: objective-c performance int nsmutabledictionary alloc


【解决方案1】:

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

这是正确的。

我想用 C 替换一个对象的原语会很容易:

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

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

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

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

【讨论】:

  • 一位朋友建议取消字典并为某些对象 during runtime 创建运行时属性。他说它甚至比字典还快。这会很好用吗?我将如何编码?
  • @TimothySwan 关联对象不适用于原语,因此您将再次使用 NSNumber 包装器。关联对象在后台使用相同的字典,所以我不期望执行速度有太大的提高。除此之外,您链接的文章很好地描述了该过程。
  • 你确定我们以同样的方式谈论关联对象吗?我将创建一个充当字典的通用对象,并为其动态添加属性。属性名称将是键。这些值可以是原始整数,对吧?
  • @TimothySwan 需要一个将对象地址“映射”到其关联对象的容器。由于这一切都是在运行时发生的,objc_getAssociatedObject 可以返回的东西都是引用,而不是原语。所以无论如何你都需要使用NSNumber
  • 我有一个值类,其属性包含原语。即使我必须分配其中一个,我也可以稍后更改其原始值。
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多