OC数组长度Count的符号与越界问题

2021-01-25  本文已影响0人  Trigger_o

先看两个例子

    NSInteger i = -1;
    NSArray *arr = @[@1];
    if(arr.count > i){
        NSLog(@"large");
    }

会输出log吗

    NSArray *arr = nil;
    for(NSInteger i=0; i < arr.count - 1; i++){
        NSLog(@"%ld",i);
    }

会输出log吗,会输出几次

答案
第一个不会输出log,第二个会输出log,会打印非常多次,几乎是无限循环
在OC中这是一个常见但是容易被忽略的问题
原因是数组的count属性是一个无符号数

count
把第二个例子改造一下
    NSArray *arr = nil;
    for(NSInteger i=0; i < arr.count - 1; i++){
        NSLog(@"%ld --- %lu",i,arr.count - 1);
    }

用%lu输出arr.count - 1,log如下


i和arr.count - 1

count作为一个无符号的0,减1之后,符号位变成1,但是因为是无符号数,符号位不起作用,于是变成一个超级大的数.

    NSArray *arr = @[];
    for(NSInteger i=0; i < arr.count - 1; i++){
        NSLog(@"%@",arr[i]);
    }

所以如果像上面这么写,就会crash,因为arr.count - 1远大于i

    NSArray *arr = @[];
    for(NSInteger i=0; i < arr.count - 1 && arr.count; i++){
        NSLog(@"%@",arr[i]);
    }

再加个条件就好了

上一篇 下一篇

猜你喜欢

热点阅读