(1)CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
(2)如何监听
//创建一个runloop监听者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"即将进入runloop");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即将处理timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即将处理source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即将进入到休眠状态");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被唤醒");
break;
case kCFRunLoopExit:
NSLog(@"runloop已经推出");
break;
default:
break;
}
;
});
//为runloop添加一个监听者
/*
第一个参数:要监听的对象
第二个参数:CFRunLoopObserverRef 观察者
第三个参数:哪种运行模式下面的状态
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
//释放观察者
CFRelease(observer);
(3)监听的状态
/*
_wrapRunLoopWithAutoreleasePoolHandler
activities = 0x1 ----->1
activities = 0xa0----->160 = 32+128
*/
//Runloop的自动释放池是什么时候创建和销毁的
/*
第一次创建:当runloop开启的时候
最后一次销毁:kCFRunLoopExit 当runloop退出的时候
其他:当runloop即将休眠的时候会把之前的自动释放池销毁,然后创建一个新的自动释放池
*/
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), //即将进入Runloop
kCFRunLoopBeforeTimers = (1UL << 1), //即将处理NSTimer
kCFRunLoopBeforeSources = (1UL << 2), //即将处理Sources
kCFRunLoopBeforeWaiting = (1UL << 5), //即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6), //刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7), //即将退出runloop
kCFRunLoopAllActivities = 0x0FFFFFFFU //所有状态改变
};