一.RunLoop 顾名思义就是一个循环,你的线程在这里开始,并运行事件处理响应输入事件.
RunLoop的作用:
1.保证程序的持续运行
2.处理App中的各种事件,(比如触摸,定时器事件,Selector事件)
3.节约CPU资源,提高程序性能,该做事情的时候做事情,该休息的时候就休息
RunLoop在iOS中有二套API
Foundation NSRunLoop
*Core Foundation 大部分东西都是C语言的
NSRunLoop 封装了CFRunLoop
二.简单介绍RunLoop与线程的关系:
每个线程都有一个与之对应的RunLoop,主线程的RunLoop在程序中是自动创建的,子线程则需要我们自己手动进行创建
三.获取RunLoop(准确的说,是获取当前线程的RunLoop)
[NSRunLoop currentRunLoop];
获取主线程的RunLoop;
[NSRunLoop mainRunLoop];
子线程的RunLoop(这是我们自己手动创建的)默认情况下NSTimer被加入NSDefaultRunLoopMode;
如果想要NSTimer收到组件或者动画影响就添加到NSRunLoopCommonModes:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadAction) object:nil];
[thread start];
四.Mode RunLoop的运行模式
注意:RunLoop是有多种模式的,但是一个RunLoop只能选择一种模式运行,如果想要切换模式,需要退出当前模式.
kCFRunLoopDefaultMode 默认模式 主线程默认模式
UITrackingRunLoopMode 页面跟踪模式
kCFRunLoopCommonModes 占位模式(包含上面二种情况,若把事件添加到此模式下,事件在上面二种模式都可以响应).
五.CFRunLoopObserverRef 是观察者 监听RunLoop的状态
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), 即将进入RunLoop
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5), 休眠之前
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities = 0x0FFFFFFFU
};
创建observer
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);
});
添加观察者:监听RunLoop的状态
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
释放Observer
CFRelease(observer);
Core Foundation内存管理
* 遇到Creat copy retain 等创建变量 需要对变量进行内存管理
*在使用完之后 对其进行Release 调用CFRelease(释放的变量)