iOS 空数组的处理

169 阅读2分钟

在 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 等其他类型。