利用runtime理解OC特性(1)

最近在深入的去理解ocruntime機制,我覺得它就像是和C的一個橋梁藕畔。為什么這么說呢马僻?大家都知道高級編程語言都需要編譯為匯編語言在編譯為機器語言變?yōu)榭蓤?zhí)行文件,但是OC并不能直接編譯為匯編語言注服,需要先轉換為C韭邓。而OCC的過渡措近,依賴的就是runtime。所以runtime的重要性就不言而喻了女淑。

OC的對象和類 —> C結構體

在剛接觸OC時瞭郑,有這些詞基本隨時都要打交道:
-類
-父類
-元類
-對象
-類對象
-實例對象
接下來將會讓你完全理解這些名詞之前的關系,我們通過<objc/Objc.h>可以發(fā)現(xiàn)有這些代碼

#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
///不透明的類型鸭你,表示Objective-C類屈张。
typedef struct objc_class *Class;

/// Represents an instance of a class.
///表示一個類的實例。
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
///指向類實例的指針袱巨。
typedef struct objc_object *id;
#endif

不難看出阁谆,類對象Class就是struct objc_class結構體,所謂的實例對象愉老,其實就是一個struct objc_object結構體笛厦,其中的isa就是指向類對象的指針,id就是指向這個結構體的指針俺夕。

在深入看一下objc_class這個結構體

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

其中包括了一個Class類型的super_class,也就是父類裳凸,以及名字、版本劝贸、信息姨谷、大小、方法列表映九、緩存等等梦湘。這也就是我們平時用到的類的這些信息了。并且這個結構體存放的數(shù)據(jù)我們稱為元數(shù)據(jù)(metadata)件甥,那么顯然這個isa指針指向的就是元類的Class捌议。
至此這些名詞已經(jīng)全部解釋清楚,整理一下可以得到這樣一個圖

image.png

到這里基本也就清楚了OC里面類和對象這些關系了引有。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓣颅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子譬正,更是在濱河造成了極大的恐慌宫补,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曾我,死亡現(xiàn)場離奇詭異粉怕,居然都是意外死亡,警方通過查閱死者的電腦和手機抒巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門贫贝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉谜,你說我怎么就攤上這事稚晚》镉牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵蜈彼,是天一觀的道長筑辨。 經(jīng)常有香客問我,道長幸逆,這世上最難降的妖魔是什么棍辕? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮还绘,結果婚禮上楚昭,老公的妹妹穿的比我還像新娘。我一直安慰自己拍顷,他們只是感情好抚太,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昔案,像睡著了一般尿贫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踏揣,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天庆亡,我揣著相機與錄音,去河邊找鬼捞稿。 笑死又谋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的娱局。 我是一名探鬼主播彰亥,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衰齐!你這毒婦竟也來了任斋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤娇斩,失蹤者是張志新(化名)和其女友劉穎仁卷,沒想到半個月后穴翩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬第,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年芒帕,在試婚紗的時候發(fā)現(xiàn)自己被綠了歉嗓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡背蟆,死狀恐怖鉴分,靈堂內(nèi)的尸體忽然破棺而出哮幢,到底是詐尸還是另有隱情,我是刑警寧澤志珍,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布橙垢,位于F島的核電站,受9級特大地震影響伦糯,放射性物質(zhì)發(fā)生泄漏柜某。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一敛纲、第九天 我趴在偏房一處隱蔽的房頂上張望喂击。 院中可真熱鬧,春花似錦淤翔、人聲如沸翰绊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽监嗜。三九已至,卻和暖如春抡谐,著一層夾襖步出監(jiān)牢的瞬間秤茅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工童叠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留框喳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓厦坛,卻偏偏與公主長得像五垮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杜秸,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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