为什么我可以从NSDictionary中拉出一个字符串,而不是另一个?

时间:2012-03-18 01:45:56

标签: objective-c nsdictionary

我有一个NSDictionary,我试图从中拉出一个字符串。出于某种原因,最后一个字符串似乎无法恢复(!?!)。在下面的代码中,我检索labelString的NSString对象,完全没有问题。但是当我尝试为foo检索NSString时,我总是没有。但是我没有看到差异 - 你能看出我做错了吗?

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                      @"name", @"fieldName", 
                      @"Name", @"labelString", 
                      foodItem.name, @"contentString", 
                      @"foo", @"fookey",
                      nil];

NSString *string1 = (NSString *)[dict objectForKey:@"fookey"];
NSString *string2 = (NSString *)[dict objectForKey:@"labelString"];
NSLog(@"[%@][%@]", string1, string2);

日志消息看起来像这样,并备份我在调试器中看到的内容(即string1为null):

2012-03-17 21:35:03.302 QuickList7 [8244:fb03] [(null)] [姓名]

真的很困惑。提前谢谢。

2 个答案:

答案 0 :(得分:5)

foodItem.name为零,因此-[NSDictionary dictionaryWithObjectsAndKeys:]会停在那里,并且不会将后续对象添加到字典中。

换句话说,就好像你这样做了:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                      @"name", @"fieldName", 
                      @"Name", @"labelString", 
                      nil];

这就是为什么你必须小心使用nil作为“参数结束”哨兵的任何方法。

答案 1 :(得分:1)

Kurt的回答是正确的,foodItem.name是nil。

为了防止这种情况,您可以在添加到字典之前始终检查对象以查看它们是否为零,或者使用以下宏将所有nil项替换为NSNull对象:

#define n2N(value) (value ? value : [NSNull null])

因此,使用该宏,上面的代码将如下所示:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSNumber numberWithInt:CellStyleLabelledStringCell], @"cellStyle",
                  @"name", @"fieldName", 
                  @"Name", @"labelString", 
                  n2N(foodItem.name), @"contentString", 
                  @"foo", @"fookey",
                  nil];

此外,没有必要将objectForKey:的结果强制转换为NSString,因为该方法返回id。