Runloop
保持程序的持續(xù)運行
處理APP中的各種事件(比如觸摸事件,定時器事件谎脯,selector事件)
節(jié)省CPU資源葱跋,提高程序性能:該做事做事,該休息時休息 (比如沒有進行操作時runLoop就會睡覺源梭,當進行操作時runLoop就會運行娱俺,很節(jié)省CPU資源)
UIApplicationMain函數(shù)內(nèi)部就啟動了一個RunLoop
所以UIApplicationMain函數(shù)一直沒有返回,保持了程序的持續(xù)運行
這個默認啟動的RunLoop是跟主線程相關(guān)聯(lián)的废麻,主線程的是默認開啟的荠卷,子線程是沒有開啟的
RunLoop對象在ios中有2套API來訪問和使用
Foundation框架 OC的 NSRunLoop :效率低,封裝的比較少烛愧,提供的API較少
CoreFoundation框架基于C的CFRunLoopRef
每條線程都有唯一的一個與之對應(yīng)的RunLoop對象
主線程runLoop已自動創(chuàng)建好了油宜,子線程的需要主動創(chuàng)建
runLoop在第一次獲取時創(chuàng)建,在線程結(jié)束時自動銷毀
獲得RunLoop對象
Foundation
【NSRunLoop? currentRunLoop】怜姿;//獲得當前線程runLoop
【NSRunLoop mainRunLoop】慎冤;//獲得主線程
CoreFoundation
CFRunLoopGetCurrent();//獲得當前線程runLoop
CFRunLoopGetMain();//獲得主線程
CFRunLoopModeRef;
// 代表runLoop的運行模式, 可以有多個mode,每個mode又包含若干個source/timer/observer ,如果為空不能跑起來? 重要組成部分沧卢,每次runLoop啟東時粪薛,只能指定一個mode,這個mode被稱作currentModel
如果需要切換mode,只能退出Loop搏恤,再重新指定一個mode進入违寿,這樣做只是為了分隔開不同組的source/timer/observer ,讓其互不影響
**************
kCFRunLoopDefaultMode 默認mode ,通常主線程是在這個mode下運行
(當有定時任務(wù)時在上面的mode進行熟空,當有滑動時切換到下面的mode進行)
UITrackingRunLoopMode 界面跟蹤mode藤巢,用于ScrollView追蹤觸摸滑動,保證界面滑動時不受其他Mode運行
UIInitializationRunLoopMode 在剛啟動時App時進入的第一個mode息罗,啟動完成后就不再使用
GSEventReceiveRunLoopMode 接收系統(tǒng)時間的內(nèi)部mode掂咒,通常用不到
KCFRunLoopCommonModes? 這是一個占位mode,不是一個真正的mode? (當設(shè)置成他迈喉,會根據(jù)情況判斷)
CFRunLoopSourceRef;//處理的事情绍刮,某個按鈕要執(zhí)行的函數(shù) ,用source泛指
Source0:非基于Port的? ? 不是系統(tǒng)提供的自己寫的
Source1:基于Port的? 系統(tǒng)提供的
CFRunLoopTimerRef挨摸;//定時器? 適時地去做事
CFRunLoopObserverRef;//監(jiān)聽? 啥時候讓runLoop執(zhí)行
是觀察者孩革,能夠監(jiān)聽runLoop的狀態(tài)改變,可以監(jiān)聽的時間點有以下幾個