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]);
}
再加个条件就好了