什么是runtime
1> runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);
2>实际上,平时我们编写的oc代码,底层都是基于runtime实现的
也就是说,我们平时编写的oc代码,最终都是转成了底层的runtime代码(c语言代码) ;
比如说,下面一个创建对象的方法中,
举例:
OC :
[[MJPerson alloc] init]
runtime :
objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)
runtime有啥用?
1>能动态生成一个类,一个成员变量,一个方法
2>能动态修改一个类,一个成员变量,一个方法
3>能动态删除一个类,一个成员变量,一个方法
runtime 相关的头文件和函数
1> 头文件
利用头文件,我们可以查看到runtime中的各个方法!
2> 相关应用
NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)
字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)
KVO(利用runtime动态产生一个类)
用于封装框架(想怎么改就怎么改)
这就是我们runtime机制的主要运用方向
3> 相关函数
objc_msgSend : 给对象发送消息
class_copyMethodList : 遍历某个类所有的方法
class_copyIvarList : 遍历某个类所有的成员变量
class_…..
这是我们学习runtime必须知道的函数!
4.必备常识
1> Ivar : 成员变量
2> Method : 成员方法
从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method
什么是RunLoop
RunLoop顾名思义运行循环,可以称它是为了多线程而存在的。
RunLoop的作用1.保持ios程序的持续稳定。2.处理app的各种事件。3.节省CPU资源,提高程序性能,有事情就做事情,没事情就休息
特别说明:
(1)如果没有Runloop,那么程序一启动就会退出,什么事情都做不了。
(2)如果有了Runloop,那么相当于在内部有一个死循环,能够保证程序的持续运行
(3)main函数中的Runloop
a 在UIApplication函数内部就启动了一个Runloop
该函数返回一个int类型的值
b 这个默认启动的Runloop是跟主线程相关联的
RunLoop对象
(1)在iOS开发中有两套api来访问Runloop
a.foundation框架【NSRunloop】
b.core foundation框架【CFRunloopRef】
(2)NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
(3)NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)
RunLoop与线程的关系
(1)RunLoop可以让线程不死,且一个runloop对应一个线程。
(2)Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建
(3)Runloop的生命周期:在第一次获取时创建,在线程结束时销毁
Runloop应用
1)NSTimer
2)ImageView显示:控制方法在特定的模式下可用
3)PerformSelector
4)常驻线程:在子线程中开启一个runloop
5)自动释放池
第一次创建:进入runloop的时候
最后一次释放:runloop退出的时候
其它创建和释放:当runloop即将休眠的时候会把之前的自动释放池释放,然后重新创建一个新的释放池