OC底層基礎

一、+load方法

  • +load方法會在runtime加載類、分類時調(diào)用

  • 每個類、分類的+load,在程序運行過程中只調(diào)用一次

  • 調(diào)用順序

    1. 先調(diào)用類的+load
      • 按照編譯先后順序調(diào)用(先編譯,先調(diào)用)
      • 調(diào)用子類的+load方法之前會先調(diào)用父類的+load
    2. 再調(diào)用分類的+load
    • 按照編譯先后順序調(diào)用(先編譯,先調(diào)用)
  • objc4源碼解讀過程:objc-os.mm

    1. _objc_init

    2. load_images

    3. prepare_load_methods

      • schedule_class_load
      • add_class_to_loadable_list
      • add_category_to_loadable_list
    4. call_load_methods

      • call_class_loads
      • call_category_loads
      • (*load_method)(cls,SEL_load)
  • +load方法是根據(jù)方法地址直接調(diào)用,并不是經(jīng)過objc_msgSend函數(shù)調(diào)用

二、+initialize方法

  • +initialize方法會在類第一次接收到消息時調(diào)用

  • 調(diào)用順序

    1. 先調(diào)用父類的+initialize,再調(diào)用子類的+initialize
    2. (先初始化父類,再初始化子類,每個類只會初始化一次)
  • +initialize+load的最大區(qū)別是,+initialize是通過objc_Send進行調(diào)用的,所以有以下特點

    1. 如果子類沒有實現(xiàn)+initialize,會調(diào)用父類的+initialize(所以父類的+initialize可能會被調(diào)用多次)
    2. 如果分類實現(xiàn)了+initialize,就覆蓋類本身的+initialize調(diào)用
  • objc4源碼解讀過程

    1. objc-msg-arm64.s
      • objc_msgSend
    2. objc-runtime-new.mm
      • class_getInstanceMethod
      • lookUpImpOrNil
      • lookUpImpOrForward
      • _class_initialize
      • callInitialize
      • objc_msgSend(cls,SEL_initialize)

三、__weak問題解決

  • 在使用clang轉換OC為C++代碼時,可能會遇到以下問題
    1. cannot create __weak reference in file using manual reference
  • 解決方案:支持ARC、指定運行時系統(tǒng)版本,比如
    1. xcrun -sdk iphoneos clang -arch ram64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-12.0.0 main.m
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容