首先是runtime 的概念
RunTime簡稱運(yùn)行時(shí),就是系統(tǒng)在運(yùn)行的時(shí)候的一些機(jī)制,其中最主要的是消息機(jī)制。
runtime的運(yùn)行機(jī)制
先看下類對(duì)象的定義
typedef struct objc_class *Class;struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if!__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
接下來看一個(gè)實(shí)例方法的調(diào)用都經(jīng)歷了什么?
Person *p = [[Person alloc] init];
[p eat];
編譯后實(shí)際是這樣
objc_msgSend(p, selector)
官方文檔
id objc_msgSend(id self, SEL op, ...)
參數(shù)
self 消息的接收者
op 消息的selector,一個(gè)C的字符串用來定位
… 消息傳入?yún)?shù)的數(shù)組
接下來就是查找這個(gè)消息執(zhí)行體
就是這一行
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
OC的對(duì)象通過isa找到類對(duì)象,類對(duì)象查找自己存儲(chǔ)的方法列表來找到對(duì)應(yīng)的方法執(zhí)行體,方法執(zhí)行體執(zhí)行具體的代碼,并返回值給調(diào)用者。
類方法又是如何處理的?
可以看得到這一行
Class isa OBJC_ISA_AVAILABILITY;
這個(gè)isa指向的一個(gè)Class類型,就是保存了類方法的地方。這個(gè)Class類型的東西就是類元對(duì)象,類元對(duì)象會(huì)查找自己存儲(chǔ)的方法列表來找到對(duì)應(yīng)的方法執(zhí)行體