Runtime常用场景
Runtime的应用都有哪些常用场景呢?
修改占位符颜色查看私有成员变量
字典转模型字典转模型
替换方法实现替换方法实现
Runtime API -类
api-类Runtime API-成员变量
成员变量Runtime API-属性
属性Runtime API-方法
方法1 方法2上面的方法不一一举例,就挑一些常用的来说明一下
更改isa指向设置isa指向的Class:
测试OC对象是否为Class判断一个OC对象是否是Class
动态添加类动态添加类,方法和属性
上面的图得到一个什么结论呢?发现成员变量只能在注册类之前添加,注册之后就不能更改了,而方法还是可以的,这个都是Class内部结构所规定的,请看 下图:
Class 结构ivar 是存放在ro变量,而ro变量是可读的权限,所以ivar只能在注册类之前添加,而方法列表和属性列表,协议列表在rw中,是可读可写的,所以方法在类注册之后依然还是可以添加的
成员变量相关
ivars交换方法
交换方法Runtime补充
什么是Runtime?平时项目中有用到么?
OC是一门动态性比较强的变成语言,允许很多操作推迟到程序运行时再进行,OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态相关的函数
平时编写的OC代码,底层都是转换成Runtime API去执行
应用场景
利用该关联对象给分类添加属性;
遍历类的所有成员变量(修改textfield的placeholder 颜色,字典转模型,自动归档解档);
交换方法实现;
方法交换交换方法应用层举例子
交换button发送事件
正常button点击事件如果现在我需要控制button的点击事件,我们可以通过交换方法去做,我们知道button继承UIControl 这个类,并且这类事件的底层调用方法都是sendAction:to:forEvent:这个方法,因此我们可以通过交换这个方法进行拦截,从而达到目的;创建UIControl分类,在load方法中交换这个方法:
button交换方法数组插入空元素奔溃
没有交换方法 交换方法后字典插入nil奔溃
没有交换方法 交换方法
网友评论