2012-03-01 55 views
9

我收到来自JSON一些响应,并且工作正常,但我需要检查一些null值,IOS检查NSArray的== NULL

我已经找到了不同的答案,但似乎不工作仍在,

NSArray *productIdList = [packItemDictionary objectForKey:@"ProductIdList"]; 

我试图与

if (!productIdList.count) //which breaks the app, 

if (productIdList == [NSNull null]) // warning: comparison of distinct pointer types (NSArray and NSNull) 

那么发生了什么?如何解决这个问题,并检查我的阵列中的null

谢谢!

+1

你是什么意思“刹车的应用程序”?如果它引发异常,请发布日志消息。 – 2012-03-01 06:05:50

回答

31

使用强制消除警告:

if (productIdList == (id)[NSNull null]) 

如果productIdList其实[NSNull null],然后做productIdList.count会抛出一个异常,因为NSNull不理解count消息。

+0

@MaKo ...隐含的,这是有效的,因为'[NSNull null]'总是返回相同的对象。 '=='比较了身份,而不是数值。 – Tommy 2012-03-01 06:20:09

+0

我错过了演员对'ID'和遗漏了这个检查(忽略它,由于编译器警告)很长一段时间!谢谢! – Jean 2013-09-04 04:17:31

+0

完美.. !!谢谢 – 2014-02-13 07:02:13

0

你应该清楚你要检查什么: 数组为空,这意味着变量不存在:


array == nil 

或阵列具有零元件,它可以:


[array count] == 0 
+0

'NSDictionary'类不能存储'nil'作为值,所以JSON解析器(和属性列表解析器)使用'[NSNull null]'来表示一个空值,因为存在的键与空值和不存在的密钥。 – 2012-03-01 06:24:12

+0

你说得对。我没有看到它来自JSON。 – scorpiozj 2012-03-01 07:39:47

+0

第一行说全部。 – 2015-12-18 12:21:51

7

您也可以使用方法isKindOfClass:检查对象的类别。

例如,在你的情况,你可以做以下操作:

if ([productIdList isKindOfClass:[NSArray class]]) 
{ 
    // value is valid 
} 

或者(如果你确信NSNull被指示无效的值)

if([productIdList isKindOfClass:[NSNull class]]) 
{ 
    // value is invalid 
} 
+0

只有一个'NSNull'的单例实例,所以使用'=='来检查它是更短更有效的。 – 2012-03-01 06:23:13

+0

但是检查返回对象的类型更安全。 – Nekto 2012-03-01 06:46:28

6

您可以使用isEqual选择:

if ([productIdList isEqual:[NSNull null]])