經過兩篇的介紹我想對RunLoop應該有了簡單的瞭解,至少不至於一無所知。 在這篇我想對“CFRunLoopObserverRef”做一下簡單的補充。 在補充之前先說一下。 在現在的開發中已經很少見到ARC了。 但是那是對與OC對象的。 CFRunLoopObserverRef屬於CF (Core ...
經過兩篇的介紹我想對RunLoop應該有了簡單的瞭解,至少不至於一無所知。
在這篇我想對“CFRunLoopObserverRef”做一下簡單的補充。
在補充之前先說一下。
在現在的開發中已經很少見到ARC了。
但是那是對與OC對象的。
CFRunLoopObserverRef屬於CF (Core Foundation)
所以我們需要手動釋放。
規則如下:
凡是帶有creat copy retain 等成分的函數創建出來的對象都要要在最後進行釋放,即Release。
// // ViewController.m // CX RunLoop淺析 // // Created by ma c on 16/3/29. // Copyright © 2016年 xubaoaichiyu. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //添加observe /* 所監聽的狀態 kCFRunLoopEntry = (1UL << 0), kCFRunLoopBeforeTimers = (1UL << 1), kCFRunLoopBeforeSources = (1UL << 2), kCFRunLoopBeforeWaiting = (1UL << 5), kCFRunLoopAfterWaiting = (1UL << 6), kCFRunLoopExit = (1UL << 7), kCFRunLoopAllActivities = 0x0FFFFFFFU */ CFRunLoopObserverRef observe = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { NSLog(@"監聽到runloop-- %zd",activity); }); //添加觀察者 CFRunLoopAddObserver(CFRunLoopGetCurrent(), observe, kCFRunLoopDefaultMode); //CF 記憶體管理 (Core Foundation) /* 凡是帶有creat copy retain 等成分的函數創建出來的對象都要要在最後進行釋放,即Release。 */ CFRelease(observe); } @end
上面是對CFRunLoopObserverRef的簡單補充。
下麵在這裡簡單介紹一下RunLoop的處理邏輯。
Runloop處理邏輯:
1,通知Observer,即將進入loop
2,通知Observer,將要處理timer
3,通知Observer,將要處理Source0
4,處理Source0
5,如果有Source1,跳到第9步
6,通知Obesrcer,線程即將休眠
7,休眠,等待喚醒
8,通知Observer,線程剛被喚醒
9,處理喚醒時收到的消息,之後跳回2
10,通知Oberver,即將退出Loop