在iOS开发过程中,避免不了要从远程请求数据。有时候我们拿到的可能会是一个空得数组(当然返回nil的可能小很小)。那么就必要对其进行非空判断,以确保我们项目的稳定性。
假设我们从远程请求到一组数据array,一般会这样处理:
NSArray *array = /***/;
if (!array) {
} else {
}
或者
if (array.count == 0) {
} else {
}
!array
或者array == nil
意味array
是一个空得对象,而不是一个NSArray
类型的对象。在OC中给一个nil
的对象发送消息是没错的,比如在非ARC模式下,我们常常会对一个销毁过后的对象采取这样操作,以防止野指针异常。array.count == 0
意味array
已经确认是一个NSArray
类型的对象,不过它的元素个数为0,即数组中没有元素的,这个比较好理解。
其实这样判断是不够全面的。因为我们在处理网络请求的数据时,获取到的很有可能是一个NSNull
对象,在控制台上显示为<null>
。这个类较为特殊,它和nil的意思一样,都是代表数组为nil,但它只有一个类方法+(NSNull)null
,也就是说它并不会接受数组的那些方法。如果我们在返回为<null>
的时候访问NSArray
的方法或者属性都是不被允许的,将会导致程序崩溃。
经过上面的分析我们知道,在处理数组的时候,就有必要考虑到<null>
这种情况。
if (![array isKindOfClass:[NSNull class]] && array.count > 0 && array != nil) {
}
这样就确保了数组不是nil
对象,也不是NSNull
对象,并且至少有一个元素的。
但这样的判断条件,看起来太繁琐了,有没有简单的点呢?当然有。
array.count > 0
其实就包含了array != nil
这种情况。那么就可以用更简便的方式去判断数组非空的情况。
if ([array isKindOfClass:[NSArray class]] && array.count > 0) {
}
首先我们要确保返回数据的确是数组NSArray
类型的,其次保证数组中至少包含有一个元素。当然,需不需要对数组的元素个数做出判断,可以视情况而定。但必须确保是NSArray
类型,而非NSNull
等其他类型。