【问题标题】:Objective-C dictionary argument is not an NSDictionaryObjective-C 字典参数不是 NSDictionary
【发布时间】:2016-05-20 14:06:16
【问题描述】:

我这里有这行代码:

punchList = [[[NSMutableDictionary alloc]initWithDictionary:[[[areaData GetPunchListDataArray:communityDesc] objectForKey:@"Root"] objectForKey:@"KeyValue"]] autorelease];

但是当我运行它时这给了我一个错误:

dictionary argument is not an NSDictionary

当我这样做时:

punchList = [[[NSMutableDictionary alloc]initWithDictionary:[[areaData GetPunchListDataArray:communityDesc] objectForKey:@"Root"]] autorelease];

    punchList = [punchList objectForKey:@"KeyValue"];

我没有收到任何错误,punchList 被填充了,为什么它在我做的第一种方式下不起作用。

【问题讨论】:

  • 你为什么还在使用autorelease? ARC怎么了?
  • 您在学习旧教程吗?你不再需要自动释放了。

标签: ios objective-c


【解决方案1】:

如果您将代码分解为带有单独变量的单独语句,可能会更清楚。失败的例子可以分解为:

punchListDataArray = [areaData GetPunchListDataArray:communityDesc];
rootObject = [punchListDataArray objectForKey:@"Root"];

// This is not dictionary, so next line fails
possibleDictionary = [rootObject objectForKey:@"KeyValue"]; 
punchList = [[[NSMutableDictionary alloc]initWithDictionary:possibleDictionary] autorelease];

第二组语句可以分解为:

punchListDataArray = [areaData GetPunchListDataArray:communityDesc];
rootObject = [punchListDataArray objectForKey:@"Root"]; 
// A different variable is being used to initialize
punchList = [[[NSMutableDictionary alloc]initWithDictionary:rootObject] autorelease];
punchList = [punchList objectForKey:@"KeyValue"];

【讨论】:

    【解决方案2】:

    punchList = [punchList objectForKey:@"KeyValue"];这行没有给你错误并不意味着结果是正确的。

    试试这个:

    punchList = [[[NSMutableDictionary alloc]initWithDictionary:[[areaData GetPunchListDataArray:communityDesc] objectForKey:@"Root"]] autorelease];
    punchList = [punchList objectForKey:@"KeyValue"];
    NSLog(@"punchList is now a %@", [punchList class]);
    id someValue = [punchList objectoForKey:@"SomeKey"];
    

    运行该代码应该会崩溃,并显示有关某个类上的未知选择器objectForKey: 的消息。控制台将显示日志消息,告诉您此时 punchList 的真正含义。

    原因与您的第一个代码块失败的原因相同。那是因为:

    [[[areaData GetPunchListDataArray:communityDesc] objectForKey:@"Root"] objectForKey:@"KeyValue"]
    

    不是NSDictionary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2010-10-17
      相关资源
      最近更新 更多