loadとinitialize
2152 ワード
load
呼び出しタイミング:app起動時にダイナミックライブラリがロードされた場合(
main
関数より前に呼び出されます)呼び出し順:親->親->本クラス->分類
+load
メソッドを実装クラスは、b
がa
を継承し、b
が+load
を実装していない場合、呼び出し:親a->本クラス->分類)Compile Source
の順序によって決定される具体的な剖析:
IMP
関数ポインタを直接呼び出すobjc_init(void)
runtime
になるたびに、load_images
メソッドが呼び出される.load_images
perpar_load_methods()
主クラスの親クラスと自身がグローバル静的構造体loadable_に追加されました.listに続いて、主クラスの分類が追加され、分類がグローバル静的構造体loadable_categories
に追加される.だからサブクラスは優先的に分類されます.recursive_mutex_t
)include
のクラスであり、+load
を実行したことがない)および親クラスを追加します.親はloadable_List
にあります.(再帰呼び出しschedule_class_load
->親...loadable_List
に追加)category
からloadabel_categorys
にcall_load_methods()
;library
のロードが完了すると、call_load_methods
を呼び出す必要があります.objc_autoReleasePoolPush
を使用してpool
を作成します.do while
親->本クラス->分類の+load
メソッドをループ呼び出します.(loadable_classes_used
->は、グローバルなポインタオフセット変数であり、メソッドが入力されるたびにインデックスのオフセットを自己加算操作で実現します.)call_class_loads
は、親クラス+load
call_category_loads
は、load
メソッドの分類を実現する+ load
メソッド*
* `cls && cls->isLoadable()` load
* `loadable_categories`
* `loadable_categories` ,
initializy
呼び出しタイミング:初めてメッセージを受信したとき(
objc_msgSend
のとき)呼び出し順:親->本クラス->分類
Compile Sources
テーブルの最後の呼び出し)呼び出しの本質:
objc_msgSend