上篇博客讲解了如何使用Runtime获取一个类的成员变量,属性,方法,协议。这篇博客将详细讲解如何动态修改一个类的变量值,如何交换方法的实现,如何动态添加类。
先做一下准备工作: 创建一个Person类
下面开始以实际例子来讲解:
1.在一般的认知中,写在.m中的成员变量属于私有变量,是不允许外部访问的。那通过Runtime的话,不管在.h还是在.m文件中的成员变量,我们都可以获取,而且可以动态修改它的值。(记得导入objc/runtime.h)
打印结果如下:
上面的代码先是获取来所有的成员变量,然后在运行时修改了name的值。
2.交换两个方法的实现(method-swizzling)。
先做点知识准备:
这里说明一下:
1)SEL其实就是一个整形标识,用来唯一标识一个方法名而已。而IMP是一个函数指针,表示方法实现的代码块地址。
2) OC在编译时会为每个方法的名字生成一个唯一的整型标识来替代方法名,这个整型标识就是SEL。在一个类中是不可能存在两个同名的方法的,即使参数类型不同也不行。但是不同的类是可以有相同的SEL的,即使这些类有继承关系也行。因为不同的类,调用方法的对象实例是不一样的。
3) 在一个工程中,所有的SEL会组成一个set集合,这就意味着不会有重复的SEL。
上面是几个跟Method有关的方法。
下面我们来看实际代码:
打印效果如下:
这里也说明一下:
1)只要是在.m文件中实现的方法,不管又没有在.h文件中声明,都会被找到。不过若是在.h中声明的方法,没有在.m中实现的方法,是不会被找到的。
2)在运行时交换方法后我们看到,明明调用了fun1,打印的确是fun2的结果,调用了fun2,打印的确是fun1的结果,很神奇。
3.在运行时动态生成一个类,为其添加成员变量和方法。
添加的方法必须是已经实现的,所以先手写这个方法。
如上就动态创建了一个类。下面我们开始使用这个类。
打印结果如下:
说明我们成功地动态创建了一个类,并且为其添加类成员变量和方法。(注意点在代码的注释中)。
好了,相信大家对Runtime又有更进一步的了解了。下篇博客将会讲解两个Runtime具体的使用,归档,Json字典和model相互转化。