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