一.Runloop —運行循環數組
1)用來幹嗎的?網絡
是一個死循環,保證程序不退出。程序默認一個線程執行一個任務,執行完任務後該線程就over掉了,但主線程不行,主線程一over掉程序就沒有了。主線程沒有事情作的時候會進入休眠狀態等待用戶的交互,用戶只要有了點擊事件,睡眠狀態下的runloop就會被喚醒。查找點擊的位置,由誰來響應點擊事件,把消息發送給對方的對象。socket
2) 在程序開發中何時會用到runloop?oop
>定時器(NSTimer 和 CADisplayLink)線程
>蘋果公開提供的Mode有兩個:KCRunLoopDefaultMode(默認等待用戶交互的) 和 KCTrackingLoopDefaultMode(專門處理滾動視圖的拖動事件)對象
目的:保證程序不退出,監聽全部事件!(觸摸/時鐘/網絡)遊戲
開發使用:事件
>實例化時鐘,添加到運行循環。開發
注意:必定要銷燬時鐘,不然會產生循環引用!get
>socket 開發,使用runloop 可以監聽網絡端口數據的接收與發送狀況!
socket 開發,一般用在智能家居開發/遊戲機。
- 有不少文章介紹 運行循環的實戰, 都會舉例 AFN 2.0的時候 NSURLConnectionURL
-必需要了解到「自動釋放池」的釋放與建立是與runloop有關的!
二.RunTime—運行時 「消息機制」
>程序啓動時,首先加載運行時!是OC的底層。
運行時的應用場景:
1)關聯對象。仿SDWebImage時,給分類動態添加屬性。作到更好的解耦。簡化使用。
2)*動態獲取類的屬性。字典轉模型使用!創建NSObject的分類。
>2.1class_copyPropertyList 獲取類屬性數組
>遍歷數組
>2.2property_getName 得到每個屬性的名稱
>添加到OC的數組
>free 釋放運行時數組