陈斌彬的技术博客

Stay foolish,stay hungry

iOS 判断数组是否为空

NSArray判断是否为空需要注意的问题。

有些开发者,在判断数组是否为空时,会写成:

if (array != nil)

或是:

if (array.count != 0)

其实严格来说,这两种写法,都是考虑不足并且不稳定的,并且忽略了一种更常见的情况。

首先来说一下,二者之间的区别。

array == nil

这种情况指的是这个array对象是一个nil对象,而不是一个NSArray类型对象。nil对象是一个可以接收任何消息的对象,它可以赋值给任何一个对象,你对它发消息也没什么问题,尽管你得不到你想要的结果。

array.count == 0

这种情况跟上一种不同的在于,此时的array是一个NSArray类型对象,只不过这个array里面没有元素。但它本身是可以作为NSArray对象来使用的。

而事实上,如果你是处理网络请求的数据,取出的array是nil对象是几乎不可能的(至少我没遇到过),多数情况下会出现的是另一种情况:

取到的array是一个NSNull对象。

NSNull是一个特殊的类,它和nil一样,也代表空值,但二者有区别,NSNull不接收NSArray的那些方法,它只有一个类方法:

+ (NSNull *)null;

因此发送NSArray特有的方法或属性访问都会导致程序crash。

我们做空值判断的很大一部分原因就是为了在后台接口数据返回一些异常数据的时候,程序能保证稳定性。

举个例子:某些情况下,后台可能由于各种原因,对某个字段返回了null值,这时我们取到的就是[NSNull null]这样一个对象,再比如说,后台可能对某一个数据取值,但取到了0个,这时返回的是一个空组,我们取到的就是@[],空组。

因此判断数组是否为空,需要对各种情况都进行判断。 写法有很多种,比如你可以写成:

if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0)