CFRunLoopObserverRef是觀察者企量,能夠監(jiān)聽RunLoop的狀態(tài)改變
可以監(jiān)聽的時(shí)間點(diǎn)有以下幾個(gè):
可以監(jiān)聽的時(shí)間點(diǎn)
- (void)observer{
// 創(chuàng)建一個(gè)監(jiān)聽者
// CFRunLoopObserverCreate(<#CFAllocatorRef allocator#>, <#CFOptionFlags activities#>, <#Boolean repeats#>, <#CFIndex order#>, <#CFRunLoopObserverCallBack callout#>, <#CFRunLoopObserverContext *context#>)
// 使用下面這種方法
/**
第一個(gè)參數(shù):(<#CFAllocatorRef allocator#>)分配存儲(chǔ)空間
第二個(gè)參數(shù):(<#CFOptionFlags activities#>)要監(jiān)聽的狀態(tài)(kCFRunLoopAllActivities)所有的狀態(tài)
第三個(gè)參數(shù):(<#Boolean repeats#>)是否持續(xù)監(jiān)聽
第四個(gè)參數(shù):(<#CFIndex order#>)優(yōu)先級(jí)
第五個(gè)參數(shù):回調(diào)
*/
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(@"即將處理 Sources");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即將進(jìn)入休眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"從休眠中喚醒loop");
break;
case kCFRunLoopExit:
NSLog(@"即將退出runloop");
break;
default:
break;
}
});
// 給runloop添加監(jiān)聽者
/**
第一個(gè)參數(shù):(<#CFRunLoopRef rl#>)要監(jiān)聽哪個(gè)runloop
第二個(gè)參數(shù):(<#CFRunLoopObserverRef observer#>)監(jiān)聽者
第三個(gè)參數(shù):(<#CFStringRef mode#>)要監(jiān)聽runloop在哪種運(yùn)行模式下的狀態(tài)
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer,kCFRunLoopDefaultMode);
/// 這里可以自己寫一個(gè)NSTimer實(shí)驗(yàn)一下
// 釋放runloop
CFRelease(observer);
}
#凡是帶有Create蔚万,Copy转质,Retain等字眼的函數(shù)涧狮,創(chuàng)建出來的對象酪碘,都要在最后做一次release操作