经过两篇的介绍我想对RunLoop应该有了简单的了解,至少不至于一无所知。
在这篇我想对“CFRunLoopObserverRef”做一下简单的补充。
在补充之前先说一下。
在现在的开发中已经很少见到MRC了。
但是那是对与OC对象的。
CFRunLoopObserverRef属于CF (Core Foundation)
所以我们需要手动释放。
规则如下:
凡是带有creat copy retain 等成分的函数创建出来的对象都要要在最后进行释放,即Release。
// // ViewController.m // CX RunLoop浅析 // // Created by ma c on 16/3/29. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //添加observe /* 所监听的状态 kCFRunLoopEntry = (1UL << 0), kCFRunLoopBeforeTimers = (1UL << 1), kCFRunLoopBeforeSources = (1UL << 2), kCFRunLoopBeforeWaiting = (1UL << 5), kCFRunLoopAfterWaiting = (1UL << 6), kCFRunLoopExit = (1UL << 7), kCFRunLoopAllActivities = 0x0FFFFFFFU */ CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { NSLog(@"监听到runloop-- %zd",activity); }); //添加观察者 CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode); //CF 内存管理 (Core Foundation) /* 凡是带有creat copy retain 等成分的函数创建出来的对象都要要在最后进行释放,即Release。 */ CFRelease(observe); } @end
上面是对CFRunLoopObserverRef的简单补充。
下面在这里简单介绍一下RunLoop的处理逻辑。
Runloop处理逻辑:
1,通知Observer,即将进入loop
2,通知Observer,将要处理timer
3,通知Observer,将要处理Source0
4,处理Source0
5,如果有Source1,跳到第9步
6,通知Obesrcer,线程即将休眠
7,休眠,等待唤醒
8,通知Observer,线程刚被唤醒
9,处理唤醒时收到的消息,之后跳回2
10,通知Oberver,即将退出Loop