iOS RunLoop(1)RunLoop簡介
iOS RunLoop(2)RunLoop相關類
iOS RunLoop(3)RunLoop原理
iOS RunLoop(4)RunLoop實戰(zhàn)應用
RunLoop簡介
什么是RunLoop抑片?
可以理解為字面意思:Run表示運行欢唾,Loop表示循環(huán)补箍。結合在一起就是運行的循環(huán)的意思既峡。哈哈嚎莉,我更愿意翻譯為『跑圈』球订。直觀理解就像是不停的跑圈瞬浓。
RunLoop實際上是一個對象舀武,這個對象在循環(huán)中用來處理程序運行過程中出現(xiàn)的各種事件(比如說觸摸事件、UI刷新事件骏啰、定時器事件节吮、Selector事件),從而保持程序的持續(xù)運行判耕;而且在沒有事件處理的時候透绩,會進入睡眠模式,從而節(jié)省CPU資源壁熄,提高程序性能帚豪。
RunLoop和線程
首先,iOS 開發(fā)中能遇到兩個線程對象: pthread_t 和 NSThread草丧。過去蘋果有份文檔標明了 NSThread 只是 pthread_t 的封裝狸臣,但那份文檔已經失效了,現(xiàn)在它們也有可能都是直接包裝自最底層的 mach thread昌执。蘋果并沒有提供這兩個對象相互轉換的接口烛亦,但不管怎么樣诈泼,可以肯定的是 pthread_t 和 NSThread 是一一對應的。比如此洲,你可以通過 pthread_main_thread_np() 或 [NSThread mainThread] 來獲取主線程厂汗;也可以通過 pthread_self() 或 [NSThread currentThread] 來獲取當前線程。CFRunLoop 是基于 pthread 來管理的呜师。
蘋果不允許直接創(chuàng)建 RunLoop娶桦,它只提供了兩個自動獲取的函數(shù):CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。
一條線程對應一個RunLoop對象汁汗,每條線程都有唯一一個與之對應的RunLoop對象衷畦。
我們只能在當前線程中操作當前線程的RunLoop,而不能去操作其他線程的RunLoop知牌。
RunLoop對象在第一次獲取RunLoop時創(chuàng)建祈争,銷毀則是在線程結束的時候。
主線程的RunLoop對象系統(tǒng)自動幫助我們創(chuàng)建好了(原理如下)角寸,而子線程的RunLoop對象需要我們主動創(chuàng)建菩混。
默認情況下主線程的RunLoop原理
我們在啟動一個iOS程序的時候,系統(tǒng)會調用創(chuàng)建項目時自動生成的main.m的文件扁藕。main.m文件如下所示:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
其中UIApplicationMain函數(shù)內部幫我們開啟了主線程的RunLoop沮峡,UIApplicationMain內部擁有一個無線循環(huán)的代碼。上邊的代碼中開啟RunLoop的過程可以簡單的理解為如下代碼:
int main(int argc, char * argv[]) {
BOOL running = YES;
do {
// 執(zhí)行各種任務亿柑,處理各種事件
// ......
} while (running);
return 0;
}
從上邊可看出邢疙,程序一直在do-while循環(huán)中執(zhí)行,所以UIApplicationMain函數(shù)一直沒有返回望薄,我們在運行程序之后程序不會馬上退出疟游,會保持持續(xù)運行狀態(tài)。
下圖是蘋果官方給出的RunLoop模型圖痕支。從上圖中可以看出颁虐,RunLoop就是線程中的一個循環(huán),RunLoop在循環(huán)中會不斷檢測卧须,通過Input sources(輸入源)和Timer sources(定時源)兩種來源等待接受事件聪廉;然后對接受到的事件通知線程進行處理,并在沒有事件的時候進行休息故慈。
文章來源:
http://www.reibang.com/p/d260d18dd551
https://blog.ibireme.com/2015/05/18/runloop/