什么会导致objectForKey:返回null并且有一个有效的字符串?

时间:2010-04-18 04:15:44

标签: objective-c cocoa nsstring nsdictionary

我遇到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:下的字典中,但当我调用null时,我得到{{1}}。我甚至尝试过清理项目的后备选项。

有没有人碰到这个,或者我只是忘记了一些非常基本的东西?

6 个答案:

答案 0 :(得分:3)

此时,由于某种原因,您仍然会收到来自DLog的报告错误。

尝试:

  1. 使用NSLog登录。
  2. 代码生效时,直接在调试器中检查newSourceString的值。

答案 1 :(得分:2)

  

什么会导致objectForKey:返回带有有效字符串的null?

两件事之一:

  1. 字典不包含该键的对象。 (无论你认为它都无关紧要。)
  2. 你没有字典; aDictnil,因此您向objectForKey:发送了nil条消息。发送给nil的邮件只会返回nil
  3.   

    正如您所看到的,字符串位于关键字newSource ...

    下的字典中

    实际上,我不确定那里发生了什么。 NSDictionary的描述(如果它包含该键的字符串)将是{ newSource = "some string here"; },它与您记录的描述不匹配。另一方面,如果它是一个不是字典的对象,则在尝试发送objectForKey:消息时,应该得到“不响应选择器”异常。因此,虽然它确实从您的日志输出中显示为某些,但我不知道它是什么,除了它可能不是字典。

    那时候,那简直很奇怪。

答案 2 :(得分:2)

我遇到了类似的问题。对我来说问题是我认为我的密钥是一个NSString,当它实际上是一个NSNumber。您可以使用以下

检查您的密钥
for (id key in [aDict allKeys]){
        NSLog(@"%@:%@",key, [[key class] description]);
    }
}

答案 3 :(得分:1)

你没有忽略你编码的环境。如果它是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

在这种情况下,通过从另一个NSDictionary中提取'key'来初始化'key',而另一个字典中的一些条目(从文件加载)包含Unicode字符。也就是说,到目前为止,我发现的唯一关联 - 从源文件中删除unicode并重新运行应用程序使其工作。

这不是gnustep1.18或&gt; = gnustep1.20

的问题

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我怀疑aDict不是NSDictionary的一个实例。 记录它的课程以确认。