【问题标题】:NSDictionary and string literal keysNSDictionary 和字符串文字键
【发布时间】:2015-06-12 13:43:23
【问题描述】:

setObject(id):forKey(id) 中使用像@"key" 这样的字符串文字是否只起作用,因为编译器优化了字符串文字的所有实例以指向同一个对象?还是用objectForKey(id) 检索对象实际上是比较键的字符串值?

如果 NSDictionary 是由 JSON 解析等外部函数创建的呢?现在,当我使用字符串字面量作为键访问对象时,这将是编译器第一次看到键字符串,并且它与 JSON 解析器在创建字典时使用的对象不同。

从外部创建的字典中访问值时,我应该使用valueForKey(NSString *) 吗?

【问题讨论】:

  • 注意:编译器优化同一字符串文字的所有实例以指向同一对象。有一次这是真的,通常仍然是真的,但在某些情况下它不是真的。这就是为什么总是需要使用 isEqualToStringisEqual 而永远不要使用 '==' 进行相等比较。

标签: ios objective-c nsstring nsdictionary nsmutabledictionary


【解决方案1】:

NSDictionary 是一个哈希表,这意味着首先通过键计算某个函数以在某个数组中找到值的索引(称为哈希码,它是一种快速操作)。 然后,由于某些键可以产生相同的哈希值,因此该哈希码的所有键都会与我们正在搜索的键进行比较。

【讨论】:

  • 这没有回答问题。问题是字符串键是否与非字符串键对象不同。通常只有完全相同的键对象与值匹配。
  • @Locutus 我在这两个方面都不同意。它准确地回答了问题,并且字典键匹配不需要完全相同的对象来命中。
  • 每个 NSObject 都有哈希函数,计算这个哈希值。如果某些对象相同,则调用 equals (isEqual?)。
  • 所以字符串很特别?两个不同的非字符串对象应该不可能匹配同一个key吧?
  • @Locutus 有多少哈希表实现了一个不可能发生键冲突的方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2018-09-23
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多