NSString为null,但代码不识别为null

时间:2013-06-15 14:13:05

标签: objective-c

我有这个应用程序,我正在填充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 *)

但是还有其他阻止。 所以我总是得到一个空指针异常。

4 个答案:

答案 0 :(得分:9)

NSNullnil不同。 NSNull(或者更明确地,[NSNull null])是一个单例,用于表示可以在Foundation集合类中使用的“nil”概念。因为它是单身,你不必使用-isEqual:,你可以直接比较它。

要检查NSNull,您可以执行以下操作:

if (tmp == [NSNull null])

答案 1 :(得分:2)

  

字典的键“start_date”有时会包含字符串格式的日期,有时它将为空

有三种情况:

  1. 密钥start_date不在您的字典中:objectForKey:的返回值为nil(第一个条件为真);
  2. 密钥start_date位于您的字典中,关联的值为[NSNull null](类型为(NSNull *)}:objectForKey:的返回值为[NSNull null](第二个条件是真的);
  3. start_date在你的字典中,相关的值是其他的:objectForKey:的返回值将是存储的对象(第二个条件为真);
  4. 但#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);