一.Runloop —运行循环数组
1)用来干吗的?网络
是一个死循环,保证程序不退出。程序默认一个线程执行一个任务,执行完任务后该线程就over掉了,但主线程不行,主线程一over掉程序就没有了。主线程没有事情作的时候会进入休眠状态等待用户的交互,用户只要有了点击事件,睡眠状态下的runloop就会被唤醒。查找点击的位置,由谁来响应点击事件,把消息发送给对方的对象。socket
2) 在程序开发中何时会用到runloop?oop
>定时器(NSTimer 和 CADisplayLink)线程
>苹果公开提供的Mode有两个:KCRunLoopDefaultMode(默认等待用户交互的) 和 KCTrackingLoopDefaultMode(专门处理滚动视图的拖动事件)对象
目的:保证程序不退出,监听全部事件!(触摸/时钟/网络)游戏
开发使用:事件
>实例化时钟,添加到运行循环。开发
注意:必定要销毁时钟,不然会产生循环引用!get
>socket 开发,使用runloop 可以监听网络端口数据的接收与发送状况!
socket 开发,一般用在智能家居开发/游戏机。
- 有不少文章介绍 运行循环的实战, 都会举例 AFN 2.0的时候 NSURLConnectionURL
-必需要了解到“自动释放池”的释放与建立是与runloop有关的!
二.RunTime—运行时 “消息机制”
>程序启动时,首先加载运行时!是OC的底层。
运行时的应用场景:
1)关联对象。仿SDWebImage时,给分类动态添加属性。作到更好的解耦。简化使用。
2)*动态获取类的属性。字典转模型使用!创建NSObject的分类。
>2.1class_copyPropertyList 获取类属性数组
>遍历数组
>2.2property_getName 得到每个属性的名称
>添加到OC的数组
>free 释放运行时数组