如何判断NSArray是否为空

严格来说,赋值前判空NSArray是非常有必要的,对于后台有句话是说

不要相信任何来自前端的数据        -- 被前端数据坑死的无数后台

对于前端也有类似的话

不要相信任何来自后台和用户的数据     -- Wythe

在很多项目中,这类判空方法都是放在公共方法中的,所以它的准确与否也是非常关键。之前和几个朋友讨论了一下这个问题,现在做个总结。

最开始项目里是这样写的

if (array && array.count) {
        /*
         * do something
         */
    }

直到后台传了个null过来

NSArray *array = [NSNull null];

if (array  && array.count) {
    /*
     * do something
     */
    NSLog(@"非空,array = %@",array);
}else{
    /*
     * do something
     */
    NSLog(@"空,array = %@",array);
}

// 输出结果
2016-05-26 17:10:19.168 BlogNSArray[4241:3485386] -[NSNull count]: unrecognized selector sent to instance 0x1a0c10490
2016-05-26 17:10:19.170 BlogNSArray[4241:3485386] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull count]: unrecognized selector sent to instance 0x1a0c10490'

看来还是得判断一下是否是NSNull,于是升级版1就是这样

NSArray *array = [NSNull null];

if (array  && ![array isKindOfClass:[NSNull class]] && array.count) {
    /*
     * do something
     */
    NSLog(@"非空,array = %@",array);
}else{
    /*
     * do something
     */
    NSLog(@"空,array = %@",array);
}
//结果设这样的
2016-05-26 17:12:49.741 BlogNSArray[4246:3486419] ,array = <null>

好像问题是解决了判断非空,也不是NSNull,也有数据。但是,问题怎么会那么简单,看看判断条件里array.count,还有没有其他的类有count方法?当然有,且不说是自己写的类,就是常用的NSDictionary就有,且看测试

NSDictionary *array = @{@"key":@"value"};

if (array  && ![array isKindOfClass:[NSNull class]] && array.count) {
    /*
     * do something
     */
    NSLog(@"非空,array = %@",array);
}else{
    /*
     * do something
     */
    NSLog(@"空,array = %@",array);
}

//结果是这样,虽说字典确实不为空,然而如果你这样就通过判断,显然后面就是一口背在身上的锅
2016-05-26 17:25:06.841 BlogNSArray[4253:3488943] 非空,array = {
    key = value;
}

所以升级版2就来了

NSDictionary *array = @{@"key":@"value"};

if (array  && ![array isKindOfClass:[NSNull class]] && [array isKindOfClass:[NSArray class]] && array.count) {
    /*
     * do something
     */
    NSLog(@"非空,array = %@",array);
}else{
    /*
     * do something
     */
    NSLog(@"空,array = %@",array);
}
//结果是这样,虽然字典不为空,但也不能算数组嘛,判他为空也是说的过去的
2016-05-26 17:37:48.806 BlogNSArray[4261:3492100] ,array = {
    key = value;
}

按理NSSarray的判空基本就应该完了,不过认真看升级版1里的代码的话不难发现有个小小的注意点。
当有这样的array时
NSArray *array = @[@"object",[NSNull null]];
这样的数组应该不少见,后台去数组时没做判断,大部分有数据,有那么几个为null就挖坑了。
而且这样的数组的确非空,前面的判断都判断不出来(我觉得也不应该盘出来,数据清洗不该是判空里面的操作),要做的就是取出数组里的数据使用时继续判空

id object = array[index];
if ([object notEmpry]) {
    /*
     * do something
     */
}

总结一下
if (array && ![array isKindOfClass:[NSNull class]] && [array isKindOfClass:[NSArray class]] && array.count)
这一行加上上面的使用数组内元素时再判空基本就是我目前使用的判断方法了,如果有问题或者改进方法,欢迎提出。

同理,NSStrintg,NSDictionary等的判空方法也差不多。

PS:其实这是很久前就想总结出来做个记录的,一直懒得弄,今天晚上要踢球,下午略空闲才写出来。