我有这个应用程序,我正在填充NSDictionary,然后在字典上进行计算。
tmp = nil;
tmp = [singleEvent objectForKey:@"start_date"];
if(tmp == nil)
{
startDate = [dateFormatter dateFromString:@"1800/1/1 12:00:00"];
}
else
{
startDate = [dateFormatter dateFromString:tmp];
}
tmp是一个NSString对象,而singleEvent是一个NSDictionary。两者都在别处宣布。为简单起见,我没有包含那部分代码。
字典的键“start_date”有时会包含字符串格式的日期,有时它将为null。
我已经处理了它将为null的条件,但代码永远不会命中该行。我通过调试发现,即使tmp为null,执行也会转到else部分。
在调试模式下,我在观看tmp时会看到这个:
tmp =(NSNull *)
但是还有其他阻止。 所以我总是得到一个空指针异常。
答案 0 :(得分:9)
NSNull
与nil
不同。 NSNull
(或者更明确地,[NSNull null]
)是一个单例,用于表示可以在Foundation集合类中使用的“nil”概念。因为它是单身,你不必使用-isEqual:
,你可以直接比较它。
要检查NSNull
,您可以执行以下操作:
if (tmp == [NSNull null])
答案 1 :(得分:2)
字典的键“start_date”有时会包含字符串格式的日期,有时它将为空。
有三种情况:
start_date
不在您的字典中:objectForKey:
的返回值为nil
(第一个条件为真); start_date
位于您的字典中,关联的值为[NSNull null]
(类型为(NSNull *)
}:objectForKey:
的返回值为[NSNull null]
(第二个条件是真的); start_date
在你的字典中,相关的值是其他的:objectForKey:
的返回值将是存储的对象(第二个条件为真); 但#2和#3确实是一样的:NSNull
是一个像其他人一样的对象。
不要混淆空指针(nil
)和Null对象([NSNull null]
)。要测试第一个,你必须这样做:
if (!tmp)
// or
if (tmp == nil)
和第二个:
if (tmp == [NSNull null])
答案 2 :(得分:1)
NSNull与nil不同。也许这会奏效:
if ( [[NSNull null] isEqual:tmp] ) {
答案 3 :(得分:-1)
如何让它变得那么小?另外我认为你的问题是你使用的是objectForKey而不是valueForKey,valueForKey将返回Nil。
startDate = [dateFormatter dateFromString:@"1800/1/1 12:00:00"];
if([singleEvent valueForKey:@"start_date"])
startDate = [dateFormatter dateFromString:[singleEvent valueForKey:@"start_date"]];
NSLog(@"%@", startDate);