为了应对服务器数据格式不对问题,特此写了防止数组越界的方法,以此避免app闪退。emmmmmm......
防止数组越界最直观的就是判空处理,但是也忒麻烦了呀。本文采用了runtime机制,众所周知,oc是运行时语言,根据这一特性,可以做好些事情。比如方法交换。至于runtime的详细机制不做过多介绍,主要说明一下用方法交换踩过的坑。。。。
数组分为不可变数组NSArray和可变数组NSMutableArray,然而NSArray和NSMutaleArray并不是数组的真正类名,所以直接操作交换的话一点用都没有!!故此时需要找到它们所指向的类名是哪个。。。。首先封装一层NSObject分类用来交换方法,以减少后续代码。


这排版。。。。为了防止代码顺序的错乱,就直接放图片了。。。。下面就开始写方法了。。。


这是对于不可变数组,找到__NSArrayI类,交换objectAtIndex:方法,测试

好,run,crash...

好吧,,好吧数组越界了,因为并不是__NSArrayI,而是__NSSingleObjectArrayI,那我再加一个好了。。。。。


此时要注意噢!!!!__NSArrayI和__NSSingleObjectArrayI交换后的方法不一样的!!!!如果你写成一样的,恭喜你,又crash掉了,,,,哭唧唧@~~@.....终于好了。。。。 下面我换一种初始化方法

run-------------------->crash。。。。。'*** -[__NSArrayI objectAtIndexedSubscript:]: index 3 beyond bounds [0 .. 1]' 对于超过一个字面量初始化的时候取值走的不是objectAtIndex: 而是[__NSArrayI objectAtIndexedSubscript:],所以还需要加上objectAtIndexedSubscript:方法


好----------------------->我再换一种初始化方法嘤嘤嘤:

run----------->crash:reason: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'。 看吧 看吧 类名有不一样了qswl!!!!再加。

交换之后的方法同上,,,,注意每一种类对应的交换之后的方法要分开写!!!!!!!
总结:NSArray初始化方法不一样的话,你拿到真正的类名就不一样,所以不是写了交换方法没有调用,而是你写的对于这个小可爱不适用。。。。。




不可变数组完结。
可变数组:这个就没有特殊的了,只有一个类名__NSArrayM

只要注意取值方式就好了^_^ ^_^ ^_^ ,,,也就是下标直接取值array[index] 还是 [arrar objectAtIndex:index]




以上。希望能有所帮助^ _ ^。。。。。。。。。。。。。
网友评论