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
- jsp的執行過程JS
- 指令的執行過程
- webpack loader 的執行過程Web
- Redis 命令的執行過程Redis
- iOS App啟動過程iOSAPP
- 一條Sql的執行過程SQL
- Javascript中new的執行過程JavaScript
- 深入理解 iOS App 的啟動過程iOSAPP
- promisify 的過程
- OAuth 2.0以及它的工作過程工作過程OAuth
- 原始碼分析OKHttp的執行過程原始碼HTTP
- 淺析Java程式的執行過程Java
- KVC中setValue:forKey:的執行過程
- js函式執行過程的探究JS函式
- ios底層 編譯過程iOS編譯
- Java 程式執行過程Java
- 執行緒池建立執行緒的過程執行緒
- 筆記-iOS應用程式的啟動過程筆記iOS
- javascript引擎執行的過程的理解--執行階段JavaScript
- 執行時的頁面構建過程
- Java執行緒池的增長過程Java執行緒
- MySQL學習 - 查詢的執行過程MySql
- MySQL innodb引擎的事務執行過程MySql
- MySQL 中一條 sql 的執行過程MySql
- PostgreSQL的insert語句執行過程分析SQL
- 一條 sql 的執行過程詳解SQL
- 一條sql語句的執行過程SQL
- Window 的新增過程
- LSM merge的過程
- MySQL的session過程MySqlSession
- 程式語言執行過程
- Oracle ASM Rebalance執行過程OracleASM
- MapReduce 執行全過程解析
- 淺談 iOS 事件的傳遞和響應過程iOS事件
- SAP Spartacus 裡的 cxOutletRef 指令執行過程分析
- Java 執行過程中的記憶體模型Java記憶體模型
- crtmpserver 執行過程簡明分析Server