在dyld
加載過程當中,咱們知道會調用_objc_init
方法,那麼在_objc_init
方法中究竟作了什麼呢?咱們來探究下。面試
從_objc_init
實現中咱們分析下該方法主要作了什麼緩存
該方法主要是讀取運行時的環境變量,咱們能夠經過設置DYLD_PRINT_STATISTICS = YES
來打印APP啓動到main()函數以前的時長,進而能夠進行APP啓動優化。具體的environ_init()簡介可參考博客iOS-底層原理 16:dyld與objc的關聯中有關nviron_init()
部分的介紹app
主要用於關於線程key的綁定,好比每線程數據的析構函數。函數
主要是C++靜態構造函數優化
主要是運行時的初始化,主要分爲兩部分:分類初始化
和類的表初始化
ui
初始化libobjc異常處理this
主要是緩存初始化spa
主要用來啓動機制回調線程
主要是dyld
註冊 實際代碼實現3d
從上文正中咱們能夠看出
mapped
即map_images
init
即load_images
unmapped
即unmap_image
從map_images
函數中咱們發現map_images_nolock函數
是重點,咱們進入map_images_nolock
函數
咱們查看代碼實現
從截圖中咱們能夠看出_read_images
是咱們要重點研究的方法
@selector
的錯亂問題
readClass
讀取出來類的信息
注意
在分類處理中主要是經過load_categories_nolock
處理,咱們進入load_categories_nolock
函數中
load_categories_nolock
函數
從load_categories_nolock
函數實現中,咱們能夠看到該函數將類
、實例方法
、協議
、屬性
、類方法
等再次連接了一次。
dyld_start
調用_objc_init
來初始化,_objc_init
中經過dyld
調用_dyld_objc_notify_register
函數,傳入map_images
跟load_images
這兩個參數來處理
map_images
經過map_images_nolock
函數調用_read_images
函數
在_read_images
函數中處理類信息、屬性、協議、分類等
當一切準備穩當,則再次返回dyld_start
中,此時dyld
跟objc
關聯了起來
若是你正在跳槽或者正準備跳槽不妨動動小手,添加一下我們的交流羣1012951431來獲取一份詳細的大廠面試資料爲你的跳槽多添一份保障。