NSMutableDictionary,来自控制台和代码的不同打印

Mar*_*ace 0 objective-c nsmutabledictionary ios4

我对NSMutableDictionary有一些疑问.我读到它们只是一个hashmap的包装器,所以不鼓励它们用于有序列表.

但我必须使用它,所以问题就开始了......

我在NSMutableDictionary中保存了Json的结果(在调用URL之后),然后我有两个不同的"print":

  • 如果我尝试使用命令"po myDictionary"从控制台打印字典我有一个订单(原始json的顺序)
  • 如果我创建一个简单的"for语句"并打印myDictionary中的每个元素,我会有不同的顺序.

这怎么可能?他们不应该有相同的订单吗?

谢谢大家!

编辑:这是代码的一个小例子:

NSMutableDictionary *myDictionary = [--{RECEIVED FROM ANOTHER CALL}--];
NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]];

for(NSString *key in myDictionary) {
    NSLog(@"%@", key);

    NSObject *object = [[NSObject alloc] init]

    /* some operation in the code with object */

    [tmp setObject:object forKey:key];
}
Run Code Online (Sandbox Code Playgroud)

在"for statement"之后发生了这样的事情:

  • 如果我看到所有的日志,我会收到一些东西(例如,如果myDictionary有一天的名字我有"星期六,星期一,星期五......")
  • 如果我在这里插入断点并尝试使用命令"po myDictionary"从控制台打印某些内容我还有另一个订单,("星期日,星期二,星期一,......")

问题是:为什么?

编辑2:我知道存在一个有"OrderedDictionary"的系统,但这不是问题:我想理解为什么我有两个不同的打印,一个来自"for statement"而另一个来自"po命令" ".

Rob*_*ier 5

po <object>gdb中的命令打印输出[<object> description].[NSDictionary description]按键对其输出进行排序.这是记录在案的行为.

如果您的JSON按键排序(听起来像是这样),那么您可以再次按键排序以确保可靠的订单.

请注意,如果您的JSON使用对象(键/值对的集合)来表示有序数据,则它违反了JSON规范.

对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组.

正确的编码是单键对象的数组,例如:

[ { "firstKey": "value" }, { "secondKey": "value" } ]
Run Code Online (Sandbox Code Playgroud)

但是,如果您可以使用排序键来定义顺序,那是合适的.