Objective-c防止数组越界而崩溃(全局效果)
2016-11-09 16:42
155 查看
数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍
对于不明确的数据总会有崩溃的风险
然而 每次调用都判断 那是太累了
so 。。runtime&category提供了一个比较简洁的解决方案
首先把NSArray/NSMutableArray的objectAtIndex方法通过objc的runtime 里面method swizzle把方法进行替换
可以看到 旧方法跟新方法的名字(在上面两个selector里面)
接着写上新方法即可
在新方法里面做越界判断
把这个NSArray的category加到pch就好了。。
demo
http://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
对于不明确的数据总会有崩溃的风险
然而 每次调用都判断 那是太累了
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
http://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
相关文章推荐
- Objective-c防止数组越界而崩溃(全局效果)
- iOS中防止数组越界之后发生崩溃
- 工具类:防止数组越界崩溃问题(NSArray 分类/runtime 用法3:交换方法)
- 怎样防止数组越界错误?
- Objective-C中使用@try处理异常,防止程序崩溃
- iOS之利用runtime,避免可变数组和可变字典为nil或者数组越界导致的崩溃
- 防止数组越界处理
- iOS 防止数组越界 对象类型不一致的安全处理 使用category对nsmutablearray处理
- ios 使用运行时规避数组等越界导致程序崩溃
- 数组越界导致的运行崩溃(枚举作为数组中的常量)
- C++中将数组作为形参时防止访问越界的几种方法
- UIPickview 省市联动注意点(如何防止同时两组或多组滑动时,数组越界问题)
- iOS - 数组,字典打印以及防止数组取值越界字典插入nil
- 如何处理数组越界而不会让程序崩溃?
- Thinking in java 多线程导致数组越界崩溃的BUG
- ios 11以上系统,tableview上啦刷新,indexPath.row,自动加5,引起数组越界的问题导致崩溃
- 重点在确定字符数组的长度!!防止数组越界
- iOS8 - tableView: canEditRowAtIndexPath: 因数组越界崩溃
- Android 通过Application捕获全局异常,防止程序崩溃退出
- 利用runtime,避免UIButton 重复点击, 可变数组和可变字典为nil,或者数组越界导致的崩溃