iOS __runtime
来源:互联网 发布:java中怎么定义数组 编辑:程序博客网 时间:2024/06/01 19:45
什么是runtime
简单的来说:Runtime就是运行时,一个程序开发的过程通常可以分为以下阶段,编辑-预编译-编译-连接-运行,运行时可以说就是我们的程序再运行的阶段发生的一些事情,在这个阶段程序通常会把一些OC的代码转化成C语言的代码,从而提高执行的效率,在这个阶段我们也可以动态的为某个对象的属性赋值,而对象的属性具体是什么类型也会在这个阶段进行确定(NSString *str = [NSData data]; 其中str在编译的时候是NSString类型,运行的时候是NSData类型)。系统也提供了Runtime的类库,让我们可以直接调用一些运行时把OC代码转化C之后的代码比如:objc_msgSend();同样也可以通过运行时,为分类添加属性,需要用到objc_getAssociatedObject和objc_setAssociatedObject函数
现在我们举个例子来说明一下runtime的使用,我们就拿imageNamed:来说吧,现在我们在工程有可能在多处实现了这个功能,现在我们想讲这里赋值的图片全部更换,如果我们去工程中查找更换会浪费我们很多时间,况且我们无法保证我们全部替换,这是我们就可以使用到runtime,在运行时替换这个方法
实现步骤
首先要给UIImage新建一个category
在.h中声明一个类方法
+(instancetype)imageWithName:(NSString *)name;
在.m中进行实现
+(void)load { // 获取到imageName方法的地址 Method imageName = class_getClassMethod(self, @selector(imageNamed:)); // 获取到imageWithName方法的地址 Method imageWithName = class_getClassMethod(self, @selector(imageWithName:)); // 交换两个方法的地址 method_exchangeImplementations(imageName, imageWithName);}//不能在分类中重写系统方法imageNamed,因为会把系统的功能给覆盖掉,而且分类中不能调用super.+(instancetype)imageWithName:(NSString *)name { UIImage *image = [UIImage imageWithName:@"2.jpg"]; if (image == nil) { NSLog(@"你的图片地址为空"); } return image;}
这些就是实现的主要代码和思想
如果感兴趣的话,详细代码和思想可以参考:https://github.com/hw2396611405/runtime
同时欢迎大家留言讨论,我们一起学习成长。
在后面我会和大家一起学习runtime的button和block的结合使用
- iOS __runtime
- iOS
- iOS
- IOS
- iOS
- iOS
- IOS
- ios
- iOS
- iOS
- IOS
- iOS
- ios
- ios ~~~~~
- ios
- IOS
- IOS
- IOS
- 时间问题,增加n秒n分n小时
- 加密类型
- [android]一个关于UDP和TCP的项目实践(二)
- vc资源 Windows资源 文件资源 自定义文件资源的读取
- 【学习笔记】3D图形核心基础精炼版-6:stage3D实战-顶点
- iOS __runtime
- 升级java1.8及ssh版本中碰到的问题(四)
- Java软件工程师 (职业简介)
- Activity全屏的方法
- Android存储之ShredPreferences
- opencv 第十章 《跟踪与运动》知识点整理、总结
- Java 基于MySQL数据库的简单学生管理系统
- js中setTimeOut()和setInterval()的使用--程序执行时间控制
- rocketMQ主从问题