1.RunTime概念
RunTime簡稱運行時,就是系統在運行的時候的一些機制。對於C語言而說,函數的調用在編譯的時候會決定調用哪個函數,編譯完成之後直接順序執行,但是對於OC來說,函數的調用指的是消息發送,在編譯的時候並不能決定真正調用哪個函數,只有在真正運行的時候纔會根據函數的名稱找到對應的函數進行調用。
消息發送的步驟:
1.通過obj的isa指針找到obj對應的class,在class中的cache通過SEL查找對應的method,如果找到了通過method中的指針跳轉到對應的函數中執行,否則進入2;
2.若在cache中沒有找到,則去methodList中去查找,如果找到了通過method中的指針跳轉到對應的函數中執行,否則進入3;
3.若在methodList也沒有找到的話,則去superClass中去查找,若果找到了通過method中的指針跳轉到對應的函數中執行,否則進入4;
4.如果找到了通過method中的指針跳轉到對應的函數中執行,則將method加入到cache中,以便下次查找。
2.RunTime中的具體實現
a.OC的變量調用在RunTime中具體實現
a)OC調用PPMember的屬性變量
PPMember.name
b)在編譯的時候RunTime會這樣找到name
Ivar *ivar = class_copyIvarList([PPMember class],&count);
const char *varName = ivar_getName(var);
b.OC的方法調用在RunTime中具體實現
a)OC中調用一個方法
[self setUI];
b)在編譯的時候RunTime會將上述代碼轉化成
objc_msgSend(self,@selector(setUI));
3.RunTime的常見作用
a)動態的添加對象的成員變量和方法;
b)動態交換兩個方法的實現;
c)實現分類並添加屬性;
d)實現NSCoding的自動歸檔喝解檔;
e)實現字典轉模型的自動轉換。
4.代碼實現