CFRunloopObserverRef

(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   //所有状态改变
};

你可能感兴趣的:(CFRunloopObserverRef)