參考
什么是Runtime
Objective-C Runtime
是一個將C語言轉化為面向對象語言的擴展
與C++的區(qū)別 C++
是基于靜態(tài)類型逆甜,而Objective-C
是基于動態(tài)運行時類型。也就是說用C++
編寫的程序編譯時就直接編譯成了可令機器讀懂的機器語言芹缔;用Objective-C
編寫的程序不能直接編譯成可令機器讀懂的機器語言赴肚,而是在程序運行的時候,通過Runtime
把程序轉為可令機器讀懂的機器語言。
Runtime中的元素
-
id和Class
Class
是一個指向objc_class
結構體的指針熊赖,而id
是一個指向objc_object
結構體的指針,其中的isa是一個指向objc_class
結構體的指針虑椎。其中的id
就是我們所說的對象震鹉,Class
就是我們所說的類。類與對象的區(qū)別:類比對象多了很多特征成員捆姜,類也可以當做一個
objc_object
來對待传趾,也就是說類和對象都是對象,分別稱作類對象(class object
)和實例對象(instance object
)泥技,這樣我們就可以區(qū)別對象和類了浆兰。isa:
objc_object
(實例對象)中isa指針指向的類結構稱為class
(也就是該對象所屬的類)其中存放著普通成員變量與動態(tài)方法(“-”開頭的方法)珊豹;此處isa指針指向的類結構稱為metaclass
簸呈,其中存放著static
類型的成員變量與static
類型的方法(“+”開頭的方法)。super_class: 指向該類的父類的指針店茶,如果該類是根類(如
NSObject
或NSProxy
)蝶棋,那么super_class
就為nil
。 -
SEL
SEL
是selector
在Objective-C
中的表示類型忽妒。selector
可以理解為區(qū)別方法的ID。結構內含有:名稱兼贸、類型
-
IMP
IMP
是“implementation”的縮寫段直,它是由編譯器生成的一個函數(shù)指針。當你發(fā)起一個消息后(下文介紹)溶诞,這個函數(shù)指針決定了最終執(zhí)行哪段代碼鸯檬。 -
Method
Method
代表類中的某個方法的類型。結構內含有
- 方法名
method_name
類型為SEL
螺垢。 - 方法類型
method_types
是一個char
指針喧务,存儲著方法的參數(shù)類型和返回值類型赖歌。 - 方法實現(xiàn)
method_imp
的類型為IMP
。
- 方法名
-
Ivar
Ivar
代表類中實例變量的類型結構內含有:變量名功茴、變量類型庐冯、基地址偏移字節(jié)、占用空間
-
objc_property_t
objc_property_t
是屬性objc_property
是內置的類型坎穿,與之關聯(lián)的還有一個objc_property_attribute_t
展父,它是屬性的attribute
,也就是其實是對屬性的詳細描述玲昧,包括屬性名稱栖茉、屬性編碼類型、原子類型/非原子類型等孵延。 -
Cache
緩存
結構內含有
-
mask
: 指定分配cache buckets
的總數(shù)吕漂。在方法查找中,Runtime
使用這個字段確定數(shù)組的索引位置尘应。 -
occupied
: 實際占用cache buckets
的總數(shù)惶凝。 -
buckets
: 指定Method
數(shù)據(jù)結構指針的數(shù)組。這個數(shù)組可能包含不超過mask+1個元素菩收。需要注意的是梨睁,指針可能是NULL
,表示這個緩存bucket
沒有被占用娜饵,另外被占用的bucket
可能是不連續(xù)的坡贺。這個數(shù)組可能會隨著時間而增長。 -
objc_msgSend
(下文講解)每調用一次方法后箱舞,就會把該方法緩存到cache列表中遍坟,下次的時候,就直接優(yōu)先從cache
列表中尋找晴股,如果cache
沒有愿伴,才從methodLists
中查找方法。
-
-
Catagory
類別
結構內含有:類別名稱电湘、類名稱隔节、實例方法列表、類方法列表寂呛、協(xié)議列表
傳遞和轉發(fā)
- 消息傳遞
- 檢查
selector
是不是要忽略的 - 檢查
target
是否為nil
-
isa
指針查找方法列表怎诫,若找不到,則從上一級父類查找贷痪,直至根class
- 若前三部分都找不到幻妓,則進入消息動態(tài)解析
- 檢查
- 消息轉發(fā)(消息動態(tài)解析)
- 通過
resolveInstanceMethod:
方法,決定是否動態(tài)添加方法 - 進入
forwardingTargetForSelector:
方法劫拢,用于指定備選對象響應這個selector
肉津,不能指定為self
- 通過
methodSignatureForSelector:
方法簽名强胰,如果返回nil
,則消息無法處理 - 調用
forwardInvocation:
方法妹沙,如果方法調用成功偶洋,則結束。如果失敗初烘,則進入doesNotRecognizeSelector:
方法涡真,若我們沒有實現(xiàn)這個方法,那么就會crash
- 通過
應用
- 字典模型互相轉換( json to model)
- 實現(xiàn)多繼承
- 添加屬性肾筐,關聯(lián)對象
- 動態(tài)增加方法
isa swizzling
method swizzling
-
NSCoding
自動歸檔哆料、解檔 - 面向層面編程