-
初识RunLoop
-
1.RunLoop的作用
-
A 保持程序的持续运行(ios程序为什么能一直活着不会死)
-
B 处理App中的各种事件(触摸、定时事件、selector事件....)
-
C 节省CPU资源,提高程序性能,有事件就处理事件,没有就休息
-
2.RunLoop的重要说明、重要说明、重要说明
-
1. 如果没有RunLoop,那么程序已启动就会退出,什么事情都做不了
-
2. 如果没有RunLoop,那么相当于在内部有一个死循环,能够保持程序持续运行
-
3. main函数中的RunLoop
- 在UIAPPlication函数内部就启动了一个RunLoop,该函数返回一个int类型的值
- 这个默认启动的RunLoop是跟主线程相关
-
3.RunLoop的API
-
1. 在iOS开发中有两套api来访问Runloop
- a.foundation框架【NSRunloop】
- b.core foundation框架【CFRunloopRef】
- #####2. NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
- #####3. NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)
-
4.RunLoop与线程
-
1.Runloop和线程的关系:一个Runloop对应着一条唯一的线程
-
问题:如何让子线程不死
-
回答:给这条子线程开启一个Runloop
-
2.Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建
-
3.Runloop的生命周期:在第一次获取时创建,在线程结束时销毁
-
5.获取RunLoop
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//获得主线程对应的runloop
NSRunLoop *mainRunLoop = [NSRunLoop mainRunLoop];
//获取当前线程对应的runloop
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"%p---%p",mainRunLoop,currentRunLoop);
/**
Runloop和线程的关系
一一对应的关系,主线程runloop已经创建,但是子线程的需要手动创建
*/
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(runLoop) object:nil];
[thread start];
}
-(void)runLoop
{ //创建子线程对应的runloop,currentRunLoop是懒加载的
NSLog(@"%@",[NSRunLoop currentRunLoop]);
NSLog(@"run---%@",[NSThread currentThread]);
}