Objective-c防止数组越界而崩溃(全局效果)
数组越界其实是很基本的问题,但是解决起来除了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 - || !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数组越界
数组越界就是假如你的下标总数现在为32个,然后你在下一秒又执行了一个方法要从50个数据里进行赋值啊筛选之类的,而你此时数组里的值为32个,50的数据还没有请求到,往往会出现数组越界的崩溃信息,大概是这 ...
- Android 【问题汇总】列表数组越界的问题
遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( ): threadid=: thread exiting with uncaught ...
- go语言之进阶篇数组越界导致panic
1.数组越界导致panic 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaa ...
- Program terminated with signal 6, Aborted. (最后发现是数组越界导致)
外网崩溃现象: 1.多台物理机中的多个进程消失,而且都是场景进程. 2.core文件都很小,看了 ulimit -a 和 cat proc/pid/limits (都很正常.看这个是为了以后core ...
- iOS如何彻底避免数组越界
我们先来看看有可能会出现的数组越界Crash的地方: ? 1 2 3 4 5 6 7 - (void)tableView:(UITableView *)tableView didSelectRowAt ...
- 数组越界保护与消息传递black机制
数组越界保护if(index.row <= [array count]) 发送消息[[NSNotificationCenter defaultCenter] postNotificati ...
- 解决Android时时更新listview数组越界问题
时时更新数据一般出现在金融.股票行业对数据的准确性要求极高情况下使用. 先来看看下面一段代码, public class MainActivity extends Activity { private ...
- iOS 数组越界 Crash加工经验
我们先来看看有可能会出现的数组越界Crash的地方. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSInd ...
- Java中的数组越界问题
Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题, ...
随机推荐
- 在asp.net mvc模式中使用PartialView返回部分HTML
PartialView(返回HTML(局部)) 在asp.net mvc中返回View时使用的是ViewResult,它继承自ViewResultBase 同时它还有个兄弟PartialViewRes ...
- poj 2503(字符串)
http://poj.org/problem?id=2503 题意:就是翻译,给你一个字典,然后再查找单词,找得到的就输出单词,找不到的输出eh,用Map水题一个,但这个题有点意思的就是输入的问题 # ...
- javaweb 中的路径问题汇总
路径问题汇总 http://localhost/day10/AServlet request.getRequestDispatcher("/AServlet") ==&g ...
- MysqlWorkbench连接远程数据
- go:系统参数or函数--未完
系统参数: os.Args 存放命令参数的字符串数组,其中os.Arg[0]为命令本身的路径,其余项存放输入的参数 例:$ go run myapp.exe -d /home os.Args[0]: ...
- 使用EmBitz开发STM32项目的环境配置
一.EmBitz软件获取与安装 1.EmBitz软件的获取 EmBitz原名Em::Blocks,是基于Code::Blocks开发的,面向嵌入式的C/C++集成开发环境.支持J-Link和ST-Li ...
- NSURLSession总结
NSURLSession(会话)(ios7新增加) //英译 Session:会议,讲话 configuration:结构,配置 expect:预期 resume:取得 suspend:推迟 pro ...
- thinkphp中volist标签
volist标签 volist标签主要用于在模板中循环输出数据集或者多维数组 volist(name,id,offset,length,key,mod,empty) name(必须):要输出的数据模型 ...
- 【leetcode】Climbing Stairs
题目简述: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either ...
- 最小化安装centos7不能执行ifconfig命令的解决方法
操作环境 虚拟机:VirtualBox 5.0.4 for Windows 操作系统:CentOS-7-x86_64-Minimal-1503-01.iso 问题描述 登录系统之后,输入ifconfi ...