Runtime


思維導(dǎo)圖

一咬腋、runtime簡介

存在的意義

? ? ? ? Objective-C語言中玩裙,許多工作是在運行時執(zhí)行的盐类,所以僅有編譯器還不行,需要Runtime(運行時系統(tǒng))來執(zhí)行編譯后的代碼寓落。

版本

? ? ? ? legacy 運行在較老的32位程序中

? ? ? ? modern運行在ios和OS X10.5之后的64位程序中

二括丁、與Runtime的交互方式

Objective-C源代碼

? ? ? ? ?編譯器在編譯源代碼時,為實現(xiàn)動態(tài)語言特性伶选,會創(chuàng)建一些數(shù)據(jù)結(jié)構(gòu)和函數(shù)史飞,它們會在程序運行時被使用。

Runtime的函數(shù)

? ? ? ? ? ?Runtime系統(tǒng)由一系列函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成具有接口的動態(tài)共享庫仰税。

? ? ? ? ? ?具體內(nèi)容參閱Objective-C Runtime Reference

NSObject的方法

? ? ? ? ? ?NSObject類中有許多方法起到了抽象接口的作用构资。如:description

? ? ? ? ? ?獲取類的信息。如:class陨簇、isKindOfClass吐绵、isMemberOfClass

三、Runtime術(shù)語

SEL

? ? ? ? ? ?是selector在Objective-C中的數(shù)據(jù)類型。

? ? ? ? ? ?selector是方法選擇器己单,相當(dāng)于區(qū)分方法的ID唉窃。

? ? ? ? ? ?是一個結(jié)構(gòu)體的指針 ? ?typedef struct objc_selector *SEL

Class

? ? ? ? ?是一個結(jié)構(gòu)體的指針? typedef struct objc_class ?*Class

? <objc/runtime.h>

? ? ? ? ?Class isa OBJC_ISA_AVAILABILITY;

? ? ? ? ?objc類本身同時也是一個對象;元類是類對象所屬的類型纹笼,表述類對象本身所具備的元數(shù)據(jù)纹份;每個類對象僅有一個類對象;?每個類對象僅有一個與之相關(guān)的元素廷痘。

? ? ? ? ?OBJC2_UNAVAILABLE ? ? ?是Objc中對系統(tǒng)運行版本進(jìn)行約束的宏定義

? ? ? ? ?Class ?super_class ? ? OBJC2_UNAVAILABLE;//超類指針

? ? ? ? ?const ?char*name ? ? ?OBJC2_UNAVAILABLE;//類名?

? ? ? ? ?long version OBJC2_UNAVAILABLE;// 類的版本信息蔓涧,默認(rèn)為0

? ? ? ? ?long info ? OBJC2_UNAVAILABLE;// 類信息,供運行期使用的一些位標(biāo)識

? ? ? ? ?long instance_size ?OBJC2_UNAVAILABLE;// 該類的實例變量大小

? ? ? ? ?struct objc_ivar_list *ivarsOBJC2_UNAVAILABLE;// 該類的成員變量鏈表

? ? ? ? struct objc_method_list **methodListsOBJC2_UNAVAILABLE;// 方法定義的鏈表

? ? ? ? struct objc_cache *cacheOBJC2_UNAVAILABLE;// 方法緩存

? ? ? ? struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE;// 協(xié)議鏈表


? struct ?objc_ivar_list *ivars ? OBJC2_UNAVAILABLE;//成員變量列表

?<objc/runtime.h>

??

struct objc_method_list **methodLists OBJC2_UNAVAILABLE;//方法列表

?<objc/runtime.h>

IMP

? ? ? ? ? ? ?由編譯器生成的函數(shù)指針

? ? ? ? ? ? ?定義:typedef ?id (*IMP)(id,SEL,...);

? ? ? ? ? ? ?該指針指向某個方法的實現(xiàn)部分

Method

? ? ? ? ? 類中某個方法的類型

? ? ? ? ? 是一個結(jié)構(gòu)體的指針 ?typedef ?struct objc_method *Method;

?<objc/runtime.h>

? ? ? ? ? ?method_name ?方法名

? ? ? ? ? ?method_types ?方法的參數(shù)類型和返回值類型

? ? ? ? ? ? method_imp 指向方法實現(xiàn)的函數(shù)指針

Ivar

? ? ? ? ? 類中實例變量的類型

? ? ? ? ? 定義:typedef struct objc_ivar*Ivar;

?<objc/runtime.h>

Cache

? ? ? ? 用于緩存最近使用的方法笋额。一個接收者對象接收到一個消息時元暴,它會根據(jù)isa指針去查找能夠響應(yīng)這個消息的對象。在實際使用中兄猩,這個對象只有一部分方法是常用的昨寞,很多方法其實很少用或者根本用不上。這種情況下厦滤,如果每次消息來時援岩,我們都是methodLists中遍歷一遍,性能勢必很差掏导。這時享怀,cache就派上用場了。在我們每次調(diào)用過一個方法后趟咆,這個方法就會被緩存到cache列表中添瓷,下次調(diào)用的時候runtime就會優(yōu)先去cache中查找,如果cache沒有值纱,才去methodLists中查找方法鳞贷。這樣,對于那些經(jīng)常用到的方法的調(diào)用虐唠,但提高了調(diào)用的效率搀愧。

? ? ? 簡單記:方法被調(diào)用時的優(yōu)化,即當(dāng)一個方法被調(diào)用時疆偿,首先在Cache中查找咱筛,沒有時再去方法列表中查找。

? ? ? ? ? ?定義:typedef struct objc_cache *Cache;

?<objc/runtime.h>

更多:

isa:需要注意的是在Objective-C中杆故,所有的類自身也是一個對象迅箩,這個對象的Class里面也有一個isa指針,它指向metaClass(元類)处铛,我們會在后面介紹它饲趋。

super_class:指向該類的父類拐揭,如果該類已經(jīng)是最頂層的根類(如NSObject或NSProxy),則super_class為NULL奕塑。

version:我們可以使用這個字段來提供類的版本信息堂污。這對于對象的序列化非常有用,它可是讓我們識別出不同類定義版本中實例變量布局的改變爵川。




四、消息

objc_msgSend函數(shù)

?Objc中發(fā)送消息語句[receiver message]會被編譯器轉(zhuǎn)化成objc_msgSend(receiver,@selector(message));

? ?四種形態(tài):

? ? ? ? ? ? ? ?objc_msgSend 給本類發(fā)送消息息楔,返回一個簡單值;

? ? ? ? ? ? ? ?objc_msgSend_fpret ?給本類發(fā)送消息寝贡,返回的是浮點數(shù);?

? ? ? ? ? ? ? ?objc_msgSend_stret 給本類發(fā)送消息值依,返回一個結(jié)構(gòu)體類型的值圃泡;

? ? ? ? ? ? ? ?objc_msgSendSuper 給父類發(fā)送一個消息,返回一個簡單值愿险;

? ? ? ? ? ? ? ?objc_msgSendSuper_stret 給父類發(fā)送一個消息颇蜡,返回一個結(jié)構(gòu)體類型的值

執(zhí)行過程:

? ? ? ? ? ? 檢測selector是不是要忽略。(如 Mac OS X 開發(fā)辆亏,有垃圾回收就不用 retain风秤,release函數(shù)了)

? ? ? ? ? ? 檢測target是不是nil對象。objc的特性是允許對一個nil對象執(zhí)行任何一個方法不會Crash扮叨,因為會被忽略掉缤弦。

? ? ? ? ? ? 從cache里面找

? ? ? ? ? ? 如果cache找不到就從下一個方法列表中找

? ? ? ? ? ? 如果方法列表找不到就到超類的方法列表中找,一直找彻磁,直到找到NSObject類為止

? ? ? ? ? ? 如果還找不到就要開始進(jìn)入動態(tài)方法解析了

方法中的隱藏參數(shù)

? ? ? ? ? ? 當(dāng)objc_msgSend函數(shù)找到對應(yīng)的實現(xiàn)時碍沐,將直接調(diào)用該方法,同時將參數(shù)傳遞給方法衷蜓。同時還將兩個隱藏的參數(shù)傳遞過去

? ? ? ? ? ? self ?指向接收消息的對象

? ? ? ? ? ? _cmd 消息的SEL值

獲取方法地址

? ? NSObject類中有methodForSelector:實例方法累提,該方法返回某個方法對應(yīng)的IMP。

?.h
?.m
?main

五磁浇、類型編碼

類型編碼

? ? ? ?編譯器使用@encode對返回值類型斋陪、參數(shù)類型進(jìn)行編碼;? Objective-C 類型編碼表

? ? ? ?輸出@encode 用%s

例如

struct MyStruct{ ? char c;} 置吓;用于參考


@encode(int) ? ? ? ? ? ? ? ? ? ? ? ? ? ?i ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int 類型


@encode(int*) ? ? ? ? ? ? ? ? ? ? ? ? ? ?^i ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一個指針類型


@encode(struct MyStruct) ? ? ? ? ? {MyStruct= c} ? ? ? ? ? ? ? ? ? ? ? ? ? ?一個無符號字符


@encode(MessageTest) ? ? ? ? ? ? ? {MessageTest=#} ? ? ? ? ? ? ? ? ? ? ?一個類對象(類)


@encode(NSStringEncoding) ? ? ? ? Q ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 無符號長整型


......具體參閱類型編碼表

六鳍贾、動態(tài)方法解析

動態(tài)方法解析

? ? ? ? ?在自定義類中聲明一個方法,但并不在實現(xiàn)部分實現(xiàn)交洗。

? ? ? ? ?在程序運行時為方法添加實現(xiàn)骑科。

待續(xù)。构拳。咆爽。









@encode(MessageTest)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梁棠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斗埂,更是在濱河造成了極大的恐慌符糊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛凶,死亡現(xiàn)場離奇詭異男娄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漾稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門模闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崭捍,你說我怎么就攤上這事尸折。” “怎么了殷蛇?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵实夹,是天一觀的道長。 經(jīng)常有香客問我粒梦,道長亮航,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任匀们,我火速辦了婚禮塞赂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昼蛀。我一直安慰自己宴猾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布叼旋。 她就那樣靜靜地躺著仇哆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夫植。 梳的紋絲不亂的頭發(fā)上讹剔,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音详民,去河邊找鬼延欠。 笑死,一個胖子當(dāng)著我的面吹牛沈跨,可吹牛的內(nèi)容都是我干的由捎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼饿凛,長吁一口氣:“原來是場噩夢啊……” “哼狞玛!你這毒婦竟也來了软驰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤心肪,失蹤者是張志新(化名)和其女友劉穎锭亏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬鞍,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡慧瘤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了固该。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅减。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹬音,靈堂內(nèi)的尸體忽然破棺而出上煤,到底是詐尸還是另有隱情休玩,我是刑警寧澤著淆,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站拴疤,受9級特大地震影響永部,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呐矾,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一苔埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜒犯,春花似錦组橄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淘菩,卻和暖如春遵班,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潮改。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工狭郑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汇在。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓翰萨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糕殉。 傳聞我的和親對象是個殘疾皇子缨历,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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