在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so 。。runtime&category提供了一个比较简洁的解决方案 首先把NSArray/NSMutableArray的objectAtIndex方法通过objc的runtime 里面method swizzle把方法进行替换 + (void)load{ [super load]; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //方法交换只要一次就好 Method oldObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:)); Method newObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(__nickyTsui__objectAtIndex:)); method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex); }); } 可以看到 旧方法跟新方法的名字(在上面两个selector里面) 接着写上新方法即可 在新方法里面做越界判断 - (id)__nickyTsui__objectAtIndex:(NSUInteger)index{ if (index > self.count - 1 || !self.count){ @try { return [self __nickyTsui__objectAtIndex:index]; } @catch (NSException *exception) { //__throwOutException 抛出异常 return nil; } @finally { } } else{ return [self __nickyTsui__objectAtIndex:index]; } } 把这个NSArray的category加到pch就好了。。
demo https://files.cnblogs.com/files/n1ckyxu/ArrayBoundsDemo.zip 请注意! 最近发现的一个小问题,对NSArray hook后会产生系统键盘会被ARC释放掉从而产生zombie memory,导致闪退的问题 具体情况: iOS8下 随机激活一个textfield/textview 键盘出现后,按home键使app进入后台,app随即闪退 解决方案:在工程配置中 设置这个NSArray的Category的.m文件使用mrc运行, 配置加上 -fno-objc-arc
|
请发表评论