iOS 空数组的处理

来源:互联网 发布:mac和虚拟机共享文件 编辑:程序博客网 时间:2024/06/16 12:28

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

原创粉丝点击