Runtime的原理

OC的消息機制

  • OC中的方法調(diào)用其實都是轉(zhuǎn)成了objc_msgSend函數(shù)的調(diào)用,給receiver方法調(diào)用者 發(fā)送一條消息selector

  • objc_msgSend底層有3大階段:
    1. 消息發(fā)送(當前類、父類中查找)
    2. 動態(tài)方法解析(resolveInstanceMethod、resolveClassMethod
    3. 消息轉(zhuǎn)發(fā)

消息轉(zhuǎn)發(fā)機制流程

  • 調(diào)用forwardingTargetForSelector:方法,返回轉(zhuǎn)發(fā)對象
    - 返回值不為nil,將消息轉(zhuǎn)發(fā)給別人
    - objc_msgSend(轉(zhuǎn)發(fā)對象, SEL);
    - 返回值為nil
    - 調(diào)用methodSignatureForSelector:方法,返回方法簽名(返回值和參數(shù)信息)
    - 返回值不為nil
    - 調(diào)用forwardInvocation:方法 --> 根據(jù)方法簽名包裝成一個NSInvocation給到方法中讓我們使用,自定義任何邏輯
    - 返回值為nil
    - 調(diào)用doseNotRecognizeSelector:方法 --> 報錯
objc_msgSend執(zhí)行流程-源碼跟讀.jpg
objc_msgSend執(zhí)行流程01.jpg
objc_msgSend執(zhí)行流程02.jpg
objc_msgSend執(zhí)行流程03.jpg
面試題-obj能調(diào)用print的原因.jpg
面試題-print中訪問成員變量1.jpg
面試題-print中訪問成員變量2.jpg

什么是Runtime?平時項目中有用過么?

  • Runtime:
    - OC是一門動態(tài)性比較強的編程語言,允許很多操作推遲到程序運行時再進行
    - OC的動態(tài)性就是由Runtime來支撐和實現(xiàn),Runtime是一套C語言的API,封裝了很多動態(tài)性相關的函數(shù)。
    - 平時編寫的OC代碼,底層都是轉(zhuǎn)換成了Runtime API進行調(diào)用

    • 平時項目中用到的地方:
      • 利用關聯(lián)對象(AssociatedObject)給分類添加屬性
      • 遍歷類的所有成員變量(可以訪問私有成員變量):修改私有成員變量、字典轉(zhuǎn)模型、自動歸檔解檔
      • 交換方法實現(xiàn):交換系統(tǒng)的方法
      • 利用消息轉(zhuǎn)發(fā)機制解決方法找不到的異常問題
      • 可以在程序運行的過程中動態(tài)生成新的類(KVO)
cache_t的結構和緩存.jpg
class_ro_t的結構.jpg
class_rw_t的結構.jpg
class:meta-class的結構圖.jpg
isa的位域.jpg
isa結構.jpg
method_t的結構.jpg
![1.無需運行直接查看匯編代碼.jpg](https://upload-images.jianshu.io/upload_images/2590027-ca812e447fb70767.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.定位匯編代碼.jpg
LLVM的中間代碼.jpg
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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