0

我有这个应用程序,我在其中填充 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”有时会包含字符串格式的日期,有时会为空。

我已经处理了它将为空的情况,但代码从未到达该行。我通过调试发现,即使 tmp 为空,执行也会转到其他部分。

在调试模式下,我在观看 tmp 时得到这个:

tmp = (NSNull *)

但还有其他块被击中。 所以我总是得到一个空指针异常。

4

4 回答 4

9

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

要检查NSNull,您可以这样做:

if (tmp == [NSNull null])
于 2013-06-15T14:25:01.860 回答
2

字典的键 "start_date" 有时会包含字符串格式的日期,有时会是 null

分三种情况:

  1. start_date不在您的字典中:将的返回值objectForKey:nil(第一个条件为真);
  2. start_date在您的字典中,关联的值是[NSNull null](类型(NSNull *):将的返回值objectForKey:[NSNull null](第二个条件为真);
  3. start_date在您的字典中,而关联的值是其他内容: 的返回值objectForKey:将是存储的对象(第二个条件为真);

但是#2 和#3 真的是一样的:NSNull是一个和其他对象一样的对象。

不要混淆空指针 ( nil) 和 Null 对象 ( [NSNull null])。要测试第一个,您必须执行以下操作:

if (!tmp)
// or
if (tmp == nil)

第二个:

if (tmp == [NSNull null])
于 2013-06-15T14:33:05.150 回答
1

NSNull 与 nil 不同。也许这会起作用:

if ( [[NSNull null] isEqual:tmp] ) { 
于 2013-06-15T14:15:11.943 回答
-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);
于 2013-06-15T14:21:06.603 回答