Runtime常用场景
Runtime的应用都有哪些常用场景呢?
查看私有成员变量

字典转模型

替换方法实现

Runtime API -类

Runtime API-成员变量

Runtime API-属性

Runtime API-方法


上面的方法不一一举例,就挑一些常用的来说明一下
设置isa指向的Class:

判断一个OC对象是否是Class

动态添加类,方法和属性

上面的图得到一个什么结论呢?发现成员变量只能在注册类之前添加,注册之后就不能更改了,而方法还是可以的,这个都是Class内部结构所规定的,请看 下图:

ivar 是存放在ro变量,而ro变量是可读的权限,所以ivar只能在注册类之前添加,而方法列表和属性列表,协议列表在rw中,是可读可写的,所以方法在类注册之后依然还是可以添加的
成员变量相关

交换方法

Runtime补充
什么是Runtime?平时项目中有用到么?
OC是一门动态性比较强的变成语言,允许很多操作推迟到程序运行时再进行,OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态相关的函数
平时编写的OC代码,底层都是转换成Runtime API去执行
应用场景
利用该关联对象给分类添加属性;
遍历类的所有成员变量(修改textfield的placeholder 颜色,字典转模型,自动归档解档);
交换方法实现;

交换方法应用层举例子
交换button发送事件

如果现在我需要控制button的点击事件,我们可以通过交换方法去做,我们知道button继承UIControl 这个类,并且这类事件的底层调用方法都是sendAction:to:forEvent:这个方法,因此我们可以通过交换这个方法进行拦截,从而达到目的;创建UIControl分类,在load方法中交换这个方法:

数组插入空元素奔溃


字典插入nil奔溃


网友评论