loadとinitialize

2152 ワード

load


呼び出しタイミング:app起動時にダイナミックライブラリがロードされた場合(main関数より前に呼び出されます)
呼び出し順:親->親->本クラス->分類
  • +loadメソッドを実装クラスは、
  • をスキップする.
  • 例えば、親a->親b->本クラス->分類(baを継承し、b+loadを実装していない場合、呼び出し:親a->本クラス->分類)
  • すべての分類が呼び出す、その呼び出し順序はCompile Sourceの順序によって決定される
  • .
    具体的な剖析:IMP関数ポインタを直接呼び出す
  • クラスロードの場合、objc_init(void)
  • を呼び出す.
  • 新しいlibraryがmapされて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のとき)
    呼び出し順:親->本クラス->分類
  • 本クラス継承親クラスの実装
  • 分類書き換えは、本クラスの実装を上書きし、1つの分類(分類はCompile Sourcesテーブルの最後の呼び出し)
  • のみを呼び出す.
    呼び出しの本質:objc_msgSend