概述
runtime:Objective-C是動(dòng)態(tài)語言蹋宦,它將很多靜態(tài)語言在編譯和鏈接時(shí)做的事放到了運(yùn)行時(shí)衔肢,這個(gè)運(yùn)行時(shí)系統(tǒng)就是runtime若专。
runtime其實(shí)就是一個(gè)庫久信,它基本上是用C和匯編寫的一套API窖杀,這個(gè)庫使C語言有了面向?qū)ο蟮哪芰Α?/p>
靜態(tài)語言:在編譯的時(shí)候會(huì)決定調(diào)用哪個(gè)函數(shù)。
動(dòng)態(tài)語言(OC):在運(yùn)行的時(shí)候根據(jù)函數(shù)的名稱找到對(duì)應(yīng)的函數(shù)來調(diào)用裙士。
isa:OC中入客,類和類的實(shí)例在本質(zhì)上沒有區(qū)別,都是對(duì)象腿椎,任何對(duì)象都有isa指針痊项,它指向類或元類(元類后面會(huì)講解)。
SEL:SEL(選擇器)是方法的selector的指針酥诽。方法的selector表示運(yùn)行時(shí)方法的名字鞍泉。OC在編譯時(shí),會(huì)依據(jù)每一個(gè)方法的名字肮帐、參數(shù)咖驮,生成一個(gè)唯一的整型標(biāo)識(shí)(Int類型的地址),這個(gè)標(biāo)識(shí)就是SEL训枢。
IMP:IMP是一個(gè)函數(shù)指針托修,指向方法最終實(shí)現(xiàn)的首地址。SEL就是為了查找方法的最終實(shí)現(xiàn)IMP恒界。
Method:用于表示類定義中的方法睦刃,它的結(jié)構(gòu)體中包含一個(gè)SEL和IMP,相當(dāng)于在SEL和IMP之間作了一個(gè)映射十酣。
消息機(jī)制:任何方法的調(diào)用本質(zhì)就是發(fā)送一個(gè)消息涩拙。編譯器會(huì)將消息表達(dá)式[receiver message]轉(zhuǎn)化為一個(gè)消息函數(shù)objc_msgSend(receiver, selector)。
Runtime的使用:獲取屬性列表耸采,獲取成員變量列表兴泥,獲得方法列表,獲取協(xié)議列表虾宇,方法交換(黑魔法)搓彻,動(dòng)態(tài)的添加方法,調(diào)用私有方法,為分類添加屬性旭贬。
什么是runtime運(yùn)行時(shí)
概述中已經(jīng)說了怔接,runtime其實(shí)就是一個(gè)庫,這個(gè)庫主要做了兩件事情:
1. 封裝:runtime把對(duì)象用C語言的結(jié)構(gòu)體來表示稀轨,方法用C語言的函數(shù)來表示扼脐。這些結(jié)構(gòu)體和函數(shù)被runtime封裝后,我們就可以在程序運(yùn)行的時(shí)候靶端,對(duì)類/對(duì)象/方法進(jìn)行操作谎势。
2. 尋找方法的最終執(zhí)行:當(dāng)執(zhí)行[receiver message]的時(shí)候凛膏,相當(dāng)于向receiver發(fā)送一條消息message杨名。runtime會(huì)根據(jù)reveiver能否處理這條message,從而做出不同的反應(yīng)猖毫。
在OC中台谍,類是用Class來表示的,而Class實(shí)際上是一個(gè)指向objc_class結(jié)構(gòu)體的指針吁断。
主要依據(jù):
##runtime的一些使用
-獲取類的屬性列表
-獲取類的方法列表
-獲取類的協(xié)議列表
-獲取類的成員變量列表
-改變私有變量的值
-為一個(gè)類增加新方法
-為類的category 增加新的屬性
-交換方法
-自動(dòng)歸檔/解檔