runloop工作主要原理和總結(jié):
- 初始化UIApplication單例對象
? - 初始化AppDelegate對象,并設為UIApplication對象的代理
? - 檢查Info.plist設置的xib文件是否有效,如果有則解凍Nib文件并設置outlets,創(chuàng)建顯示key window、rootViewController、與rootViewController關聯(lián)的根view(沒有關聯(lián)則看rootViewController同名的xib),否則launch之后由程序員手動加載。
? - 建立一個主事件循環(huán),其中包含UIApplication的Runloop來開始處理事件。
- 初始化UIApplication單例對象
? - 初始化AppDelegate對象,并設為UIApplication對象的代理
? - 檢查Info.plist設置的xib文件是否有效,如果有則解凍Nib文件并設置outlets,創(chuàng)建顯示key window、rootViewController、與rootViewController關聯(lián)的根view(沒有關聯(lián)則看rootViewController同名的xib),否則launch之后由程序員手動加載。
? - 建立一個主事件循環(huán),其中包含UIApplication的Runloop來開始處理事件。
UIApplication:
1、通過window管理視圖;
2、發(fā)送Runloop封裝好的control消息給target;
3、處理URL,應用圖標警告,聯(lián)網(wǎng)狀態(tài),狀態(tài)欄,遠程事件等。
AppDelegate:
管理UIApplication生命周期和應用的五種狀態(tài)(notRunning/inactive/active/background/suspend)。
Key Window:
1、顯示view;
2、管理rootViewcontroller生命周期;
3、發(fā)送UIApplication傳來的事件消息給view。
rootViewController:
1、管理view(view生命周期;view的數(shù)據(jù)源/代理;view與superView之間事件響應nextResponder的“備胎”);
2、界面跳轉(zhuǎn)與傳值;
3、狀態(tài)欄,屏幕旋轉(zhuǎn)。
view:
1、通過作為CALayer的代理,管理layer的渲染(順序大概是先更新約束,再layout再display)和動畫(默認layer的屬性可動畫,view默認禁止,在UIView的block分類方法里才打開動畫)。layer是RGBA紋理,通過和mask位圖(含alpha屬性)關聯(lián)將合成后的layer紋理填充在像素點內(nèi),GPU每1/60秒將計算出的紋理display在像素點中。
2、布局子控件(屏幕旋轉(zhuǎn)或者子視圖布局變動時,view會重新布局)。
3、事件響應:event和guesture。
插播控制器生命周期
runloop:
1、(要讓馬兒跑)通過do-while死循環(huán)讓程序持續(xù)運行:接收用戶輸入,調(diào)度處理事件時間。
2、(要讓馬兒少吃草)通過mach_msg()讓runloop沒事時進入trap狀態(tài),節(jié)省CPU資源。
1、與線程和自動釋放池相關:
2、CFRunLoopRef構(gòu)造:數(shù)據(jù)結(jié)構(gòu);創(chuàng)建與退出;mode切換和item依賴;Runloop啟動
? ? ? ? - CFRunLoopModeRef:數(shù)據(jù)結(jié)構(gòu)(與CFRunLoopRef放一起了);創(chuàng)建;類型;
? ? ? ? ? modeItems:- CFRunLoopSourceRef:數(shù)據(jù)結(jié)構(gòu)(source0/source1);
? ? ? ? ? ? ? ? ? ? ? ? ? ? - source0 :
? ? ? ? ? ? ? ? ? ? ? ? ? ? - source1 :
? ? ? ? ? ? ? ? ? ? ? - CFRunLoopTimerRef:數(shù)據(jù)結(jié)構(gòu);創(chuàng)建與生效;相關類型(GCD的timer與CADisplayLink)
? ? ? ? ? ? ? ? ? ? ? - CFRunLoopObserverRef:數(shù)據(jù)結(jié)構(gòu);創(chuàng)建與添加;監(jiān)聽的狀態(tài);
3、Runloop內(nèi)部邏輯:關鍵在兩個判斷點(是否睡覺,是否退出)
? ? ? ? - 代碼實現(xiàn):
? ? ? ? - 函數(shù)作用棧顯示:
4、Runloop本質(zhì):mach port和mach_msg()。
5、如何處理事件:
? ? ? ? - 界面刷新:
? ? ? ? - 手勢識別:
? ? ? ? - GCD任務:
? ? ? ? - timer:(與CADisplayLink)
? ? ? ? - 網(wǎng)絡請求:
6、應用:
? ? ? ? - 滑動與圖片刷新;
? ? ? ? - 常駐子線程,保持子線程一直處理事件