iOS main()執行前的過程 + weak 置 nil的過程
main()
- MachO 初始化;
- 讀取程式碼檔案(ImageLoader);
- dyld 通知 runtime 對 map_images 進行處理;
- + load 方法;
- dyld 呼叫 main 函式.
ps: 第一次啟動 app 耗時較長, 就是由於要將 MachO 載入到快取中, 等到第二次啟動 app 時, 直接從快取中讀取資料!
weak
runtime 會對註冊的類進行佈局, 物件被 weak 修飾以後, 將呼叫 objc_initWeak
初始化一個新的 weak 指標指向物件地址, 然後呼叫 objc_storeWeak()
更新新的指標的指向, 建立弱引用 hash 表(將物件地址作為 key, 將 weak 指標地址作為 value), 最後等到引用計數為0時, 呼叫 clearDeallocating
將hash 表中 key 所對應的 valueArray 全部置 nil, 然後清除此條記錄.
-
置 nil 的步驟:
- 呼叫 objc_release();
- dealloc();
- _objc_rootDealloc();
- object_dispose();
- objc_destructInstance();
- objc_clear_deallocating
runloop
runloop 是一個讓執行緒能隨時處理事件但不退出的機制. runloop 實際是一個物件, 這個物件管理了其需要處理的事件和訊息, 並提供了一個入口函式來執行 Event Loop 邏輯. 執行緒執行了這個函式後, 就會一直處於這個函式內部 "接受訊息"->"等待"->"處理"的迴圈中, 直到這個迴圈結束(quit).
iOS/OSX 系統中, 提供了兩個 runloop 物件, NSRunloop 和 CFRunloopRef. 執行緒和 runloop 之間是一一對應的, 其關係是儲存在一個全域性的字典中. 執行緒建立時並沒有開啟 runloop, 如果不主動獲取, 那它一直不會開啟. runloop 的建立是發生在第一次獲取時, runloop 的銷燬是發生線上程結束時. 只能現線上程內部, 獲取當前執行緒的 runloop(主執行緒除外).
相關文章
- main的啟動過程AI
- 分享針對iOS裝置執行紋理載入過程的方法iOS
- Redis 命令的執行過程Redis
- HiveSQL的執行過程分析HiveSQL
- jsp的執行過程JS
- iOS App 的完整啟動過程iOSAPP
- sql 執行過程SQL
- 一條Sql的執行過程SQL
- Javascript中new的執行過程JavaScript
- webpack loader 的執行過程Web
- 儲存過程中巢狀儲存過程的變數執行方式儲存過程巢狀變數
- sql執行過程分析SQL
- Oracle DDL 執行過程Oracle
- Java 程式執行過程Java
- 淺析Java程式的執行過程Java
- js函式執行過程的探究JS函式
- 原始碼分析OKHttp的執行過程原始碼HTTP
- CoreData執行過程的sql語句SQL
- 剖析SQL語句的執行過程SQL
- Mapreduce(二):MR的執行過程分析
- Oracle SQL 語句的執行過程OracleSQL
- 殺掉後臺執行的過程
- 執行緒池建立執行緒的過程執行緒
- 實戰儲存過程排程過程儲存過程
- 深入理解 iOS App 的啟動過程iOSAPP
- iOS編譯過程的原理和應用iOS編譯
- ios底層 編譯過程iOS編譯
- nagios配置過程詳解iOS
- javascript引擎執行的過程的理解--執行階段JavaScript
- Java執行緒池的增長過程Java執行緒
- KVC中setValue:forKey:的執行過程
- MySQL學習 - 查詢的執行過程MySql
- 一條sql語句的執行過程SQL
- 執行時的頁面構建過程
- 一條 sql 的執行過程詳解SQL
- MySQL 中一條 sql 的執行過程MySql
- Java 執行緒池的建立過程分析Java執行緒
- MySQL innodb引擎的事務執行過程MySql