代码之家  ›  专栏  ›  技术社区  ›  theMikeSwan

什么原因会导致objectforkey:返回null并在适当位置返回有效字符串?

  •  7
  • theMikeSwan  · 技术社区  · 14 年前

    我有个问题 NSDictionary 返回 null 对于一个 NSString 即使这个字符串在字典里。代码如下:

    - (void)sourceDidChange:(NSNotification *)aNote {
        NSDictionary *aDict = [aNote userInfo];
        DLog(@"%@", aDict);
        NSString *newSourceString = [aDict objectForKey:@"newSource"];
        DLog(@"%@", newSourceString);
        newSourceString = [newSourceString stringByReplacingOccurrencesOfString:@" " withString:@""];
        DLog(@"%@", newSourceString);
        NSString *inspectorString = [newSourceString stringByAppendingString:@"InspectorController"];
        DLog(@"%@", inspectorString);
        newSourceString = [newSourceString stringByAppendingString:@"ViewController"];
        DLog(@"%@", newSourceString);
    }
    

    我得到以下日志语句:

    2010-04-17 23:50:13.913 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] { newSource = "Second View"; }
    2010-04-17 23:50:13.914 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
    2010-04-17 23:50:13.916 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
    2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
    2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null)
    

    如您所见,字符串在字典中的键下 newSource ,但当我打电话 objectForKey: 我得到 无效的 . 我甚至试过回退方案来清理这个项目。

    有人遇到过这种事吗?还是我忘了一些基本的东西?

    6 回复  |  直到 11 年前
        1
  •  3
  •   TechZen    14 年前

    在这一点上,由于某种原因,您将看到来自dlog的报告错误。

    尝试:

    1. 使用nslog进行日志记录。
    2. 检查的值 newSourceString 当代码处于活动状态时直接在调试器中。
        2
  •  2
  •   Peter Hosey    14 年前

    会导致什么 objectForKey: 返回空值并在适当的位置输入有效字符串?

    两件事之一:

    1. 字典不包含该键的对象。(不管你) 认为 这是无关紧要的。)
    2. 你没有字典; aDict nil ,所以你要发送 对象分叉: 消息到 . 消息到 什么也不做,只回来 .

    如您所见,该字符串在字典中的键newsource下

    实际上,我不知道发生了什么。nsdictionary的描述(如果它包含该键的字符串)将是 { newSource = "some string here"; } ,这与您记录的描述不匹配。另一方面,如果它是一个不是字典的对象,那么在尝试向它发送 对象分叉: 消息。因此,虽然从日志输出中可以看到 某物 ,我不知道它是什么,只知道它可能不是字典。

    那就太奇怪了。

        3
  •  2
  •   Tico Ballagas    11 年前

    我遇到了类似的问题。对我来说,问题是我认为我的密钥是nsstring,而实际上它是nsnumber。你可以用以下方法检查你的钥匙

    for (id key in [aDict allKeys]){
            NSLog(@"%@:%@",key, [[key class] description]);
        }
    }
    
        4
  •  1
  •   Micha    14 年前

    你不能忽视你正在编码的环境。如果是gnustep,特别是gnustep1.19,请继续阅读。否则忽略。

    我刚刚在gnustep1.19(.3)中遇到一个非常奇怪的错误,但它完美地模拟了这个问题。

    NSString * key = <some string>
    NSDictionary * dict = <some dictionary>
    
    (gdb) p [dict objectForKey:key]
    $20 = (struct objc_object *) 0x0
    (gdb) p [dict objectForKey:@"MyKeyValue"]
    $22 = (struct objc_object *) 0x7fffd94fe690
    (gdb) p [key compare"@MyKeyValue"]
    $25 = NSOrderedSame
    

    在本例中,“key”是通过从另一个nsdictionary中提取它来初始化的,而另一个dictionary中的某些条目(从文件加载)包含unicode字符。也就是说,到目前为止,我发现的唯一关联是从源文件中删除Unicode并重新运行该应用程序,这样就可以工作了。

    这不是gnustep1.18或>=gnustep1.20的问题

        5
  •  0
  •   Andy Milburn    14 年前

    我怀疑你的字符串实际上,字面上是“(空的)”——也就是说,它有6个字母长,拼出了(-n-u-l-l-)。

        6
  •  0
  •   Jeff Laing    11 年前

    我怀疑adct不是nsdictionary的一个实例。 记录它的类以确认。