RunRunLoop初识

一.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(释放的变量)
    
 
原文地址:https://www.cnblogs.com/LzwBlog/p/5388568.html