1》runtime实现的机制是什么,怎么用,一般用于干嘛?
runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。
在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者。
比如说,下面一个创建对象的方法中,
举例:
OC :
[[MJPerson alloc] init]
runtime :
objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)
第二个问题
runtime 用来干什么呢??用在那些地方呢?怎么用呢?
runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)
在程序运行过程中, 动态创建一个类(比如KVO的底层实现)
在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法
遍历一个类的所有成员变量(属性)\所有方法
例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!
Runtime原理:OC的底层实现需要首先被编译成C语言,继而被编译成汇编语言。所以当我们对性能有要求,或者OC不能满足需求时我们就可以使用runtime机制实现。了解了原理之后就可以利用runtime做一些OC做不了的事情。比如系统的字典转模型方法就是利用了runtime这一机制,在运行时动态遍历模型的属性,并赋值,再比如KVO动态监听就是利用runtime动态创建了一个新的类来描述被监听者的属性。我再说一下我们平时常用的runtime的一些方法吧。
1.交换系统方法。因为runtime机制会在OC执行方法时发送消息,将OC方法转换成C语言的函数,所以我们可以利用这一原理在控制器加载数据之前去动态替换系统方法,将一些复杂的代码极大的简化。比如在loadview方法中交换加载图片的方法,这样在程序运行的整个期间,都可以根据条件去加载不同的图片库,实现换肤的效果。避免了挨个换图片的麻烦。
2.获取类的属性和方法,这个和OC系统方法里的字典转模型类似,通过runtime方法遍历类的属性和方法。
3.给category添加属性。这一点弥补了category只能添加类的方法不能添加属性的不足,但是这样并不会为属性分配存储空间。所以还是要自定义变量去开辟一个空间去保存添加的属性。