NSDictionary allKeys - 它总是返回相同的顺序吗?

Posted

技术标签:

【中文标题】NSDictionary allKeys - 它总是返回相同的顺序吗?【英文标题】:NSDictionary allKeys - does it always return the same order? 【发布时间】:2012-03-05 22:58:55 【问题描述】:

我是 Objective-C 的新手,我今天正在使用 NSDictionaries,遇到了 allKeys 方法。据我了解,它以随机顺序返回一个包含字典键的 NSArray。但是,这个顺序总是一样吗?即,如果我连续 20 次在同一个字典上调用 allKeys,我能保证得到相同的结果顺序吗?

谢谢,

【问题讨论】:

【参考方案1】:

如果您在未发生变异的字典中连续调用该方法 20 次,它很可能会返回相同的顺序。也就是说,我强烈建议您不要依赖它,因为它高度依赖于实现细节。我说它很可能返回相同顺序的唯一原因是因为访问字典不应该改变任何内部结构,并且在没有突变的情况下,获得不同的唯一方法顺序是明确引入非确定性,即依赖全局状态,例如随机数生成器或 CPU 的时钟,我发现 NSDictionary 是否能做到这一点非常值得怀疑。

如果您需要确保键的顺序相同,您可能应该在从字典中获取它们后对它们进行排序。

【讨论】:

当然,除非 NSDictionary 会进行延迟重新散列,在这种情况下,访问可能会触发重新散列。 @Catfish_Man:如果是这样的话,将NSDictionary 传递给另一个线程是不安全的。当前的智慧表明,只要字典是不可变的,在线程之间传递NSDictionaries 是安全的。 一个不可变的字典不应该在填充后重新散列,因为它的任何内容都不会改变。我指的是一个可变的。 @Catfish_Man:将NSMutableDictionarys 视为不可变的NSDictionarys 是相当普遍的。对于来自框架方法的NSDictionary 返回值尤其如此,您甚至可能不知道它实际上是一个可变字典。惰性散列可能会破坏许多现有应用程序。 凯文:嗯,是的,没错。这正是 CFURL 在 10.7.2 之前的实际情况。 >. 【参考方案2】:

NSDictionary 对象是无序的以保持性能。

如果您需要有序字典,请查看此项目:

http://code.google.com/p/cocoa-sorted-dictionary/

【讨论】:

【参考方案3】:

解决这个问题的方法是编写一个快速测试程序。真的,您永远不应该依赖这样的无保证、无文件记录的结果。这是一种糟糕的编程习惯,而且很可能会随着新的操作系统版本而中断。

如果您需要按特定顺序返回的键,则应在检索它们后对其进行排序。您可以使用-[NSArray sortedArrayUsing...] 方法组来做到这一点。

【讨论】:

以上是关于NSDictionary allKeys - 它总是返回相同的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

为啥我得到“[__NSArrayI allKeys]:无法识别的选择器发送到实例”/为啥 NSDictionary 正在转换?

如何从 NSDictionary 中获取键和值?

避免在 NSDictionary 中排序

NSDictionary和NSArray打印中文出现乱码的解决方案

关于iOS去除数组中重复数据的几种方法