你的位置:首页 > 操作系统

[操作系统]RunTimeRunLoop初见


什么是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)NSTimer2)ImageView显示:控制方法在特定的模式下可用3)PerformSelector4)常驻线程:在子线程中开启一个runloop5)自动释放池  第一次创建:进入runloop的时候  最后一次释放:runloop退出的时候  其它创建和释放:当runloop即将休眠的时候会把之前的自动释放池释放,然后重新创建一个新的释放池