CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变
可以监听的时间点有以下几个:
- (void)observer{
// 创建一个监听者
// CFRunLoopObserverCreate(<#CFAllocatorRef allocator#>, <#CFOptionFlags activities#>, <#Boolean repeats#>, <#CFIndex order#>, <#CFRunLoopObserverCallBack callout#>, <#CFRunLoopObserverContext *context#>)
// 使用下面这种方法
/**
第一个参数:(<#CFAllocatorRef allocator#>)分配存储空间
第二个参数:(<#CFOptionFlags activities#>)要监听的状态(kCFRunLoopAllActivities)所有的状态
第三个参数:(<#Boolean repeats#>)是否持续监听
第四个参数:(<#CFIndex order#>)优先级
第五个参数:回调
*/
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(@"即将处理 Sources");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即将进入休眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"从休眠中唤醒loop");
break;
case kCFRunLoopExit:
NSLog(@"即将退出runloop");
break;
default:
break;
}
});
// 给runloop添加监听者
/**
第一个参数:(<#CFRunLoopRef rl#>)要监听哪个runloop
第二个参数:(<#CFRunLoopObserverRef observer#>)监听者
第三个参数:(<#CFStringRef mode#>)要监听runloop在哪种运行模式下的状态
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer,kCFRunLoopDefaultMode);
/// 这里可以自己写一个NSTimer实验一下
// 释放runloop
CFRelease(observer);
}
#凡是带有Create,Copy,Retain等字眼的函数,创建出来的对象,都要在最后做一次release操作