OC的消息機制
OC中的方法調(diào)用其實都是轉(zhuǎn)成了
objc_msgSend函數(shù)的調(diào)用,給receiver方法調(diào)用者 發(fā)送一條消息selectorobjc_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)
- 利用關聯(lián)對象(
- 平時項目中用到的地方:

cache_t的結構和緩存.jpg

class_ro_t的結構.jpg

class_rw_t的結構.jpg

class:meta-class的結構圖.jpg

isa的位域.jpg

isa結構.jpg

method_t的結構.jpg



2.定位匯編代碼.jpg

LLVM的中間代碼.jpg