概述
runtime:Objective-C是動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時做的事放到了運行時,這個運行時系統(tǒng)就是runtime。
runtime其實就是一個庫,它基本上是用C和匯編寫的一套API,這個庫使C語言有了面向?qū)ο蟮哪芰Α?/p>
靜態(tài)語言:在編譯的時候會決定調(diào)用哪個函數(shù)。
動態(tài)語言(OC):在運行的時候根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用。
isa:OC中,類和類的實例在本質(zhì)上沒有區(qū)別,都是對象,任何對象都有isa指針,它指向類或元類(元類后面會講解)。
SEL:SEL(選擇器)是方法的selector的指針。方法的selector表示運行時方法的名字。OC在編譯時,會依據(jù)每一個方法的名字、參數(shù),生成一個唯一的整型標(biāo)識(Int類型的地址),這個標(biāo)識就是SEL。
IMP:IMP是一個函數(shù)指針,指向方法最終實現(xiàn)的首地址。SEL就是為了查找方法的最終實現(xiàn)IMP。
Method:用于表示類定義中的方法,它的結(jié)構(gòu)體中包含一個SEL和IMP,相當(dāng)于在SEL和IMP之間作了一個映射。
消息機制:任何方法的調(diào)用本質(zhì)就是發(fā)送一個消息。編譯器會將消息表達式[receiver message]轉(zhuǎn)化為一個消息函數(shù)objc_msgSend(receiver, selector)。
Runtime的使用:獲取屬性列表,獲取成員變量列表,獲得方法列表,獲取協(xié)議列表,方法交換(黑魔法),動態(tài)的添加方法,調(diào)用私有方法,為分類添加屬性。
什么是runtime運行時
概述中已經(jīng)說了,runtime其實就是一個庫,這個庫主要做了兩件事情:
1. 封裝:runtime把對象用C語言的結(jié)構(gòu)體來表示,方法用C語言的函數(shù)來表示。這些結(jié)構(gòu)體和函數(shù)被runtime封裝后,我們就可以在程序運行的時候,對類/對象/方法進行操作。
2. 尋找方法的最終執(zhí)行:當(dāng)執(zhí)行[receiver message]的時候,相當(dāng)于向receiver發(fā)送一條消息message。runtime會根據(jù)reveiver能否處理這條message,從而做出不同的反應(yīng)。
在OC中,類是用Class來表示的,而Class實際上是一個指向objc_class結(jié)構(gòu)體的指針。
主要依據(jù):
##runtime的一些使用
-獲取類的屬性列表
-獲取類的方法列表
-獲取類的協(xié)議列表
-獲取類的成員變量列表
-改變私有變量的值
-為一個類增加新方法
-為類的category 增加新的屬性
-交換方法
-自動歸檔/解檔