(1)CFRunLoopObserverRef是觀察者,能夠監(jiān)聽RunLoop的狀態(tài)改變
(2)如何監(jiān)聽
//創(chuàng)建一個runloop監(jiān)聽者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"即將進(jìn)入runloop");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即將處理timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即將處理source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即將進(jìn)入到休眠狀態(tài)");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被喚醒");
break;
case kCFRunLoopExit:
NSLog(@"runloop已經(jīng)推出");
break;
default:
break;
}
;
});
//為runloop添加一個監(jiān)聽者
/*
第一個參數(shù):要監(jiān)聽的對象
第二個參數(shù):CFRunLoopObserverRef 觀察者
第三個參數(shù):哪種運行模式下面的狀態(tài)
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
//釋放觀察者
CFRelease(observer);
(3)監(jiān)聽的狀態(tài)
/*
_wrapRunLoopWithAutoreleasePoolHandler
activities = 0x1 ----->1
activities = 0xa0----->160 = 32+128
*/
//Runloop的自動釋放池是什么時候創(chuàng)建和銷毀的
/*
第一次創(chuàng)建:當(dāng)runloop開啟的時候
最后一次銷毀:kCFRunLoopExit 當(dāng)runloop退出的時候
其他:當(dāng)runloop即將休眠的時候會把之前的自動釋放池銷毀,然后創(chuàng)建一個新的自動釋放池
*/
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), //即將進(jìn)入Runloop
kCFRunLoopBeforeTimers = (1UL << 1), //即將處理NSTimer
kCFRunLoopBeforeSources = (1UL << 2), //即將處理Sources
kCFRunLoopBeforeWaiting = (1UL << 5), //即將進(jìn)入休眠
kCFRunLoopAfterWaiting = (1UL << 6), //剛從休眠中喚醒
kCFRunLoopExit = (1UL << 7), //即將退出runloop
kCFRunLoopAllActivities = 0x0FFFFFFFU //所有狀態(tài)改變
};