我有一个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)] [姓名]
真的很困惑。提前谢谢。
答案 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。