iOS_Runtime修改变量值,交换方法实现,动态添加类,成员变量和方法
2016-07-27 11:36
477 查看
上篇博客讲解了如何使用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相互转化。
先做一下准备工作: 创建一个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相互转化。
相关文章推荐
- iOS - 大文件下载篇(输出流对象)
- iOS绘图教程
- iOS- 点赞动画效果
- CocoaPods pod install/pod update更新慢的问题
- iOS 通过NSURLSession只获取响应头
- 浅解:iOS应用程序中的性能优化
- iOS新特性实现3DTouch开发
- iOS中nil 、NULL、 Nil 、NULL的区别
- IOS 开发过程中问题汇总
- nagios系列(六)之nagios实现对服务器cpu温度的监控
- nagios系列(六)之nagios实现对服务器cpu温度的监控
- iOS 图片拉伸处理
- 弹出键盘 tableview定位到编辑位置
- IOS 多线程,线程同步的三种方式
- iOS(CoreGraphics)画带箭头的框
- ios多线程开发的常用三种方式
- iOS判断输入的字符是否都是中文
- iOSpush到下一个页面,去掉tabBar占用页面的大小
- iOS 计算两个坐标之间的距离
- [iOS] 绘制虚线CGContextSetLineDash的使用