iOS runtime再学习
生活随笔
收集整理的這篇文章主要介紹了
iOS runtime再学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
iOS面試專題一
幾乎是默寫出來,加上自己理解的博客(iOS面試)
持續更新中。。。
問題:當方法轉發到另一個類的對象的時候,另一個類沒有對應的屬性怎么辦,會崩潰嗎?
文章目錄
- 1.基礎數據結構
- 2.對象,類對象,元類對象
- 3.消息傳遞,方法查找
- 4.消息轉發,動態方法解析
- 5.runtime的使用
- 運行時runtime
- 編譯:將高級語言翻譯成計算機能聽懂的二進制語言
- 運行:計算機開始執行這些二進制語言所記錄的內容
oc是一門動態語言,它將盡可能多的決策從編譯時和鏈接時推遲到運行時。這意味著它不僅需要一個編譯器,還需要一個運行時系統來執行編譯后的代碼,也就是runtime
Messaging(消息機制):消息傳遞,方法查找
- 消息(方法聲明)直到運行時才綁定到方法實現。編譯器將消息表達式轉換為對消息傳遞函數objc_msgSend的調用。這個函數接收消息中提到的接收方和方法的名稱(方法選擇器)作為它的兩個主要參數,消息中傳遞的任何參數也會傳遞給objc_msgSend
消息傳遞函數objc_msgSend完成動態綁定所需的一切
- 找到IMP --> 調用IMP --> 返回返回值
- 一個類分派表。這個表中有一些條目,它們將方法選擇器與它們所標識的方法的特定于類的地址相關聯
消息轉發,動態方法解析
- resoleveInstanceMethode
- forwardingTargetForSelector
- methodSignatureForSelector, forwardInvacation
runtime使得閉源的iOS變為開源,獲取系統類的私有屬性,方法和成員變量。用kvc賦值,用runtime調用方法
- oc的方法調用,實際上就是給對象發消息
- 在運行時選擇方法的實現 – 方法(IMP)被動態地綁定到消息(SEL)
1.基礎數據結構
- cache_t
- bucket_t:key(SEL),IMP
- 用于快速查找方法執行函數
- 是可增量擴展的哈希表結構
- 是局部性原理的最佳應用
- class_rw_t - methods: 二維數組,一個類可能有多個分類。 readwrite
- class-ro_t - methods: 一維數組,readonly
- isa指針 指針型:isa的值代表Class的地址。 非指針型:isa的值的部分代表Class的地址
- method_t 函數四要素:名稱(SEL),參數,返回值,函數體(IMP)
- Type Encodings V-void @-id : - SEL
2.對象,類對象,元類對象
- 類對象存儲實例方法列表等信息
- 元類對象存儲類方法列表等信息
- 根元類對象的父類是根類,所有NSObject類對象可以調用實例對象的方法
3.消息傳遞,方法查找
- objc_msgSend(id self, SEL _cmd), 消息傳遞轉化為了函數調用
- [super class]:objc_msgSendSuper(super,@selector(class)), 從父類的方法列表開始尋找,返回的還是self的類對象,是向self發消息
- 消息的傳遞過程(機制)
4.消息轉發,動態方法解析
- 動態方法解析(Dynamic Method Resolution)
- resolveInstanceMethod:動態添加方法的實現
- 消息轉發(Message Forwarding):轉發到其他對象的同名方法
- forwardingTargetForSelector(Fast forwarding):轉發給別的對象去實現
- Normal forwarding:可以轉發到本對象的其他方法,也可以轉發到其他的對象的其他方法
- methodSignatureForSelector: 方法簽名
- forwardInvocation: 方法實現(調用)
- Method-Swizzling
5.runtime的使用
- 可以使得閉源的iOS變為開源,獲取系統類的私有屬性,方法和成員變量。用kvc賦值
iOS runtime 動態攔截方法,設置參數 tableView改變索引欄的字體大小和顏色
總結
以上是生活随笔為你收集整理的iOS runtime再学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS - Xcode提高编译速度,增量
- 下一篇: UE4入门之软件安装