ios runtime 總結介紹

runtime介紹:

runtime 簡稱運行時, 是一套純c編寫的API.

?objective-c是基于c的,為c添加了面向?qū)ο蟮奶匦?它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了runtime運行時來處理.可以說runtime是oc的幕后工作者.

我們都知道高級編程語言想要成為可執(zhí)行文件,需先編譯為匯編語言再匯編為機器語言,機器語言也是計算機能夠識別的唯一語言,但是oc并不能直接編譯為匯編語言,而是先要轉(zhuǎn)寫為純C語言在進行編譯和匯編操作,從oc到c語言的過渡就是就是由runtime實現(xiàn)的.

我們使用oc進行面向?qū)ο箝_發(fā),而c語言更多的是面向過程開發(fā),這就需要將面向?qū)ο蟮念愞D(zhuǎn)變?yōu)槊嫦蜻^程的的結構體.其實我們創(chuàng)建的一個對象或?qū)嵗褪且粋€結構體,這個結構體里定義了很多變量,有, 指向元類的isa, 指向父類的指針,類的名字,版本,實例大小,實例變量列表,方法列表,緩存,租售的協(xié)議列表,結構體如下:

structobjc_class {?

?????Class isa OBJC_ISA_AVAILABILITY;?

?????Class super_class

????const char * name

????long version?

????long info

????long instance_size

????struct objc_ivar_list *ivars

????struct objc_method_list **methodLists

????struct objc_cache *cache

????struct objc_protocol_list *protocols?

?}

runtime最主要的是消息機制.,

對于c語言,函數(shù)的調(diào)用在編譯的時候會決定調(diào)用哪個函數(shù).

oc的函數(shù)調(diào)用稱為消息發(fā)送,屬于動態(tài)調(diào)用過程.在編譯的時候并不能決定真正調(diào)用哪個函數(shù),只要聲明過就不會報錯,只有當運行的時候才會報錯,這是因為oc是運行時動態(tài)調(diào)用的.而c語言調(diào)用未實現(xiàn)的函數(shù)就會報錯.

runtime消息機制

NSMutableString *str = [[NSMutableString alloc] initWithString: @"hello"];

[str appendString:@" world"];

上述代碼的str稱為消息接受者,appendString:稱作選擇子,也就是我們常用的selector餐曹,selector和參數(shù)共同構成了消息橘券,所以第二句話可以理解為將消息:"增加一個字符串: is a good guy"發(fā)送給消息的接受者str。

objc_msgSend的工作原理, 為了匹配消息的接受者和選擇子首先會在消息的接受者所在的類中去搜索這個struct objc_cache,如果能找到就可以直接跳到相關的具體實現(xiàn)中去調(diào)用,如果找不到,再去 struct objc_method_list方法列表搜索,如果能找到就可以直接跳到相關的具體實現(xiàn)中去調(diào)用,如果找不到,就會通過super_class指針沿著繼承樹向上搜索,如果找到就跳轉(zhuǎn),如果到了繼承樹的根部(通常是NSObject)還沒找到,那就會包unrecongnized selector錯誤(其實在條用這個方法之前還會進行消息轉(zhuǎn)發(fā),還有三次機會處理, 這就體現(xiàn)了runtime的強大).

三次機會:

1,所屬類動態(tài)方法解析

如果沿繼承樹沒有搜索到相關方法,則會向接受者所屬類進行一次請求,看是否能動態(tài)添加一個方法,注意這是一個類方法,因為是是想接受者所屬的類進行請求

+(BOOL)resolveInstanceMethod:(SEL)name

2,備援接受者

當對象所屬類不能動態(tài)添加方法后,runtime就會詢問當前的接受者是否有其他對象可以處理這個位置的selector:

- (id)forwardingTargetForSelector:(SEL)aSelector;

3,消息重定向

當沒有北苑接受者事,就只剩下最后一次機會了,那就是消息重定向,這個時候runtime會將未知消息的所有細節(jié)都封裝為NSInvocation對象,方法如下:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

- (void)forwardInvocation:(NSInvocation *)anInvocation

runtime的其他作用:?動態(tài)添加屬性,動態(tài)添加方法,交換方法(method swizzling)

獲取屬性

int main(int argc, const char * argv[]) {

????????@autoreleasepool {

????????????????Person* p = [[Person alloc] init];

????????????????p.cjmName = @"Jiaming Chen";

????????????????unsigned int propertyCount = 0;

????????????????objc_property_t *propertyList = class_copyPropertyList([p class], ????&propertyCount);

????????????????for (int i = 0; i < propertyCount; i++) {

????????????????????????const char* name = property_getName(propertyList[i]);

????????????????????????const char* attributes = property_getAttributes(propertyList[i]);

????????????????????????NSLog(@"%s %s", name, attributes);

????????????????}

????????????}

????return 0;

????} ?


動態(tài)添加屬性

class_addProperty

方法交換: 本質(zhì)是修改selector對應的_imp,也就是修改實例方法的具體實現(xiàn)

int main(int argc, const char * argv[]) {

????????????@autoreleasepool {

????????????????????Person *p = [[Person alloc] initWithName:@"Jiaming Chen" age:22];

????????????????????Method method1 = class_getInstanceMethod([p class], @selector(helloWorld));

????????????????????Method method2 = class_getInstanceMethod([p class], @selector(showMyself));

????????????????????method_exchangeImplementations(method1, method2);

????????????????????[p showMyself];

? ? ? ? ? ? ? ? ? ? ?[p helloWorld];

????????????????}

????????????????return 0;

????} ?


消息調(diào)用

iOS runtime探究(一): 從runtime開始理解面向?qū)ο蟮念惖矫嫦蜻^程的結構體

iOS runtime探究(二): 從runtime開始深入理解OC消息轉(zhuǎn)發(fā)機制

iOS runtime探究(三): 從runtime開始理解OC的屬性property

iOS runtime探究(四): 從runtiem開始實踐Category添加屬性與黑魔法method swizzling

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竹捉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子憨闰,更是在濱河造成了極大的恐慌,老刑警劉巖泽示,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異变姨,居然都是意外死亡渔呵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双饥,“玉大人咏花,你說我怎么就攤上這事∨锞眨” “怎么了窍株?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵瑰钮,是天一觀的道長。 經(jīng)常有香客問我苟耻,道長凶杖,這世上最難降的妖魔是什么腾么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任漆撞,我火速辦了婚禮浮驳,結果婚禮上,老公的妹妹穿的比我還像新娘健霹。我一直安慰自己糖埋,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆铁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辣垒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音奥帘,去河邊找鬼。 笑死已旧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的秸讹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凿将,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起膳算,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谎脯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怜姿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片社牲。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖湃交,靈堂內(nèi)的尸體忽然破棺而出才沧,到底是詐尸還是另有隱情温圆,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布置逻,位于F島的核電站推沸,受9級特大地震影響诽偷,放射性物質(zhì)發(fā)生泄漏飞苇。R本人自食惡果不足惜忿等,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘸右。 院中可真熱鬧太颤,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廊蜒,卻和暖如春山叮,著一層夾襖步出監(jiān)牢的瞬間暮胧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工俺亮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲁冯,地道東北人衡创。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像晶通,于是被迫代替她去往敵國和親璃氢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容