Runtime(运行时)
来源:互联网 发布:撮合交易平台源码 编辑:程序博客网 时间:2024/05/18 16:15
基本解释
- Runtime 是一套比较底层的纯C语言API 它是OC的幕后工作者 我们平时写的OC代码
- 在运行时都会编译器转为runtime的C语言代码 其中最主要的是消息机制OC的函数调用
- 成为消息发送 属于动态调用过程 在编译的时候并不能决定真正调用哪个函数事实证明
- 在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错
- 而C语言在编译阶段就会报错 只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
简单实例
obj doSometing
其中obj是一个对象,makeText是一个函数名称。对于这样一个简单的调用。在编译时RunTime会将上述代码转化成:
objc_msgSend(obj,@selector(doSomething);
首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method(猜测]cache中method列表是以]EL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中
实际应用
Json到Model的转化
在开发中相信最常用的就是接口数据需要转化成Model了(当然如果你是直接从Dict取值的话。。。),很多开发者也都使用著名的第三方库如JsonModel、Mantle或MJExtension等,如果只用而不 知其所以然,那真和“搬砖”没啥区别了,下面我们使用runtime去解析json来给Model赋值。
原理描述:用runtime提供的函数遍历Model自身所有属性,如在json中有对应的值,则将其赋值。
- 核心方法:在NSObject的分类中添加方法
快速归档
有时候我们要对一些信息进行归档,如用户信息类UserInfo,这将需要重写initWithCoder和encodeWithCoder方法,并对每个属性进行encode和decode操作。那么问题来了:当属性只有几个的时候可以轻松写完,如果有几十个属性呢?那不得写到天荒地老?。。。
原理描述:用runtime提供的函数遍历Model自身所有属性,并对性encode和decode操作
- 核心方法:在Model的基类中重写方法:
访问私有变量
我们知道,OC中没有真正意义上的私有变量和方法,要让成员变量私有,要放在m文件中声明,不对外暴露。如果我们知道这个成员变量的名称,可以通过runtime获取成员变量,再通过getIvar来获取它的值。
方法:
给分类(Category)添加属性
遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、setter方法。查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter、setter方法。有没有解决方案呢?有,通过运行时建立关联引用。接下来以添加一个这样的属性为例:
@property (nonatomic, copy) NSString *str;
在匿名分类或者头文件中添加属性。区别是:匿名分类中添加的是私有属性,只在本类中可以使用,类的实例中不可以使用。头文件中添加的在类的实例中也可以使用。
在setStr:方法中使用了一个objc_setAssociatedObject的方法,这个方法有四个参数,分别是:源对象,关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),关联的对象和一个关联策略。
用来标记是哪一个属性的key常见有三种写法,但代码效果是一样的,如下:
Method swizzling(方法交换)
方法交换,顾名思义,就是将两个方法的实现交换。例如,将A方法和B方法交换,调用A方法的时候,就会执行B方法中的代码,反之亦然。
- iOS_运行时runtime
- iOS运行时 runtime
- 浅析运行时Runtime
- Runtime 运行时定义
- 运行时Runtime 小结
- runtime运行时
- 运行时runtime
- runtime运行时
- runtime 运行时
- RunTime 运行时
- iOS runtime 运行时
- 运行时runtime
- 运行时runtime
- IOS runtime运行时
- Runtime运行时
- runtime运行时
- Runtime 运行时:知识点
- Runtime(运行时)
- GreenDao 3.0解析
- 字节和位和k的关系
- Android获取SDcard目录及创建文件夹;
- html标签的使用(一)
- MFC 获取当前路径
- Runtime(运行时)
- gradle针对版本号的管理——任务模式,直接修改build.gradle文件
- 途客圈见面会-要点总结
- ORA-06511: PL/SQL: cursor already open
- Scala入门之OOP
- Hibernate 注解注册
- 标准Web系统的架构分层
- NSOperation 和 GCD 的区别
- 线性表的C语言实现