行使Runtime-解决程序崩溃问题(gitHub持续更新)

(1)什么是Runtime ?(当然Runtime 还有许多用,我所说的只是它的冰山一角)

   
 听着很高大尚的样子,其实过多时候大家都在用,只不过,你不知道而已:那么大家来概括领悟一下如何是Runtime,大家都清楚Object-C
是基于C语言所衍生出来并追加了面向对象概念的语言.

   
然则OC和此外面向对象的语言仍旧有分此外,比如在其余语言里面叫做艺术调用,而在OC里面叫做给目标发送音信.并且OC
把数据类型的确定有编译时推迟到了运转时,我们平常调用方法 [recive
message];并不会立马执行message这一个方法,而是向recive
发送一个message消息.

   
我们平日在先后里很容易碰着一种状态,需求平素在改,不领悟如何时候,和后台钻探好的事物,过了个周一,变得面目全非,貌似是流星撞了地球,而你还傻呵呵找问题出在哪?,有时候如故造成程序直接崩溃,当然一个名牌的程序员,会想到这种景观,做各类判断,哪还有没有其他什么更好的点子呢.当然是局部,刚才也说了,程序崩溃无非是给目的发送了一个他处理不了的问题,比如:向一个数组添加一个nil
元素;

C++,诚如这种景色一直崩给您看

(2)问题化解-思路

   既然是向目标发送了一个不可处理的音讯(上述图片中:是向可变数组arry
发送一条  addObject
的音讯),那么我们能不可以在她们发送音讯的时候,改变一下,假诺是拍卖不了的信息,音讯就不转发,而是在控制台打印一条信息:告诉大家奔溃原因呢.–答案自然是足以的:例如–利用Method
Swizzling==>在程序运行的时候交流两个情势的调用,例如程序要调用
addObject这多少个法子,那么我们让程序先调用一下祥和的措施,

(3)问题迎刃而解-怎么着兑现

1.先打开你的主次,看一下崩溃音信,里面有一个reason 
如若您的次第是因为数组越界(取值范围超出数组的元素个数–常见问题)而夭折,那么控制台会打印出-[__NSArrayM
objectAtIndex:]: index 1000 beyond bounds for empty array

2.牢记上边的 音信 会用到: 
大家现在就让系统的方法,和我们自己写的法子开展置换,那么咋样互换呢:首先大家要得到这几个措施,通过class_getInstanceMethod获取实例方法.(当然也有收获类措施的 
class_getClassMethod)(我们需要导入一个头文件:#import
<objc/runtime.h>)

图中__NSArrayM  和objectAtIndex是在上一步控制哈博罗内获取;

如此这般就拿到系统中的objectAtIndex方法(因为超越数组元素个数而夭折),通过这多少个办法,再去得到大家和好写的章程,与之交流调用时机.

运行时交流调用方法,进行判定,假设条件非法-打印原因;假如程序不私自,调用系统方法

DEMO链接:
点击进入gitHub

* 使用方法

“`

把DEMO中 类目
文件夹里的公文拷贝到你的连串中,不需要引入不需要做任何任何事情.然后编译之后,没有不当,试一下数组越界,会不会崩溃,假使没有崩溃,集成完毕.

“`