從objc.h開始

提前聲明:本系列文章的objc源碼是基于objc-723源碼的杀餐。不同的版本裙盾,可能都有所不同,但相信除了部分語法及機(jī)制上的變更郎任,不會(huì)有本質(zhì)的差別秧耗。

關(guān)于Objc的運(yùn)行時(shí)原理及消息機(jī)制,對(duì)于做iOS開發(fā)的人舶治,或多或少都有所接觸分井。然而,由于這部分知識(shí)在我們的項(xiàng)目中使用的頻率實(shí)在太低霉猛。因此尺锚,對(duì)于大多數(shù)從事iOS開發(fā)的人而言是學(xué)而不精。即便惜浅,我們?cè)啻位仡欉@些知識(shí)瘫辩。可能真到某一節(jié)點(diǎn)坛悉,還是會(huì)從頭來復(fù)習(xí)一邊伐厌,以增進(jìn)理解÷阌埃可是挣轨,到目前為止,并沒有一份很好的資料來體系化的介紹關(guān)于Objc的源碼空民。

今天刃唐,我們就開始我們這一系列教材的第一篇,讀objc.h文件界轩。

為什么画饥,要從這個(gè)文件開始呢?很簡單浊猾,我們平日里做Objc開發(fā)時(shí)抖甘,最基本最直接的就放在這個(gè)文件里了。

打開文件葫慎,忽略掉引入的頭文件和一些非關(guān)鍵信息衔彻,我們看到的第一條語句是:

typedef struct objc_class *Class;

這就是我們平日里用到的Class類型了薇宠。而緊隨其后的是Objc面向?qū)ο缶幊讨校瑢?shí)例的結(jié)構(gòu)表示的定義:

struct objc_object {

? ? Class _Nonnull isa? OBJC_ISA_AVAILABILITY;

};

typedef struct objc_object *id;

id即是我們平日里用的比較多的Objc對(duì)象的一個(gè)類型表示艰额。

接下來澄港,則是我們常用的SEL:

typedef struct objc_selector *SEL;

之后即是我們平日不常用,也不常見柄沮,但對(duì)Objc的整個(gè)方法調(diào)用機(jī)制極為重要的IMP了:

#if !OBJC_OLD_DISPATCH_PROTOTYPES

typedef void (*IMP)(void /* id, SEL, ... */ );

?#else

typedef id _Nullable (*IMP)(id _Nonnull, SEL _Nonnull, ...);?

#endif

緊接著往下回梧,是對(duì)BOOL及其對(duì)應(yīng)的值YES與NO的定義和對(duì)Nil與nil的定義。在這里要強(qiáng)調(diào)一下祖搓,從源碼的角度來講狱意,Nil與nil在定義上是完全一樣的,兩者的用途也沒有嚴(yán)格的要求拯欧,也就是說详囤,兩者本質(zhì)上是可以通用的,但是镐作,還是建議我們按章通常的約定用Nil表示空類藏姐,用nil表示對(duì)空象。至于為什么這么說滑肉,原因很多包各,就不細(xì)說了。當(dāng)然靶庙,如果你硬要將兩者用到混用问畅,其實(shí)誰也無法阻止,畢竟最后及其都會(huì)將二者識(shí)別為相同的東西六荒。

再繼續(xù)往下护姆,則是對(duì)非ARC(或稱MRC)機(jī)制下的關(guān)于引用計(jì)數(shù)內(nèi)存管理相關(guān)的參數(shù)的保護(hù)性定義。這包括__strong掏击,__unsafe_unretained卵皂,__autoreleasing。

繼續(xù)往下看砚亭,定義的是幾個(gè)與函數(shù)或方法名操作相關(guān)的:

OBJC_EXPORT const char * _Nonnull sel_getName(SEL _Nonnull sel) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

OBJC_EXPORT SEL _Nonnull sel_registerName(const char * _Nonnull str) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

OBJC_EXPORT const char * _Nonnull object_getClassName(id _Nullableobj) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

OBJC_EXPORT void* _Nullable object_getIndexedIvars(id _Nullable obj) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) OBJC_ARC_UNAVAILABLE;

OBJC_EXPORT BOOL sel_isMapped(SEL _Nonnull sel) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

OBJC_EXPORT SEL _Nonnull sel_getUid(const char * _Nonnull str) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

緊接著的幾個(gè)操作都是針對(duì)內(nèi)存引用技術(shù)的操作灯变,在當(dāng)前版本下已經(jīng)被廢棄。但是捅膘,這并不意味著這對(duì)我們就不重要了添祸。因?yàn)橄旅娴膸讉€(gè)操作在比較老的版本中,對(duì)內(nèi)存管理是比較重要的寻仗。只是隨著objc版本的不斷迭代改進(jìn)刃泌,而在當(dāng)前的版本廢棄了而已,不過言歸正傳,對(duì)這幾個(gè)操作的了解可以幫我們加深對(duì)內(nèi)存管理的理解耙替,但是在實(shí)際應(yīng)用場景中亚侠,我們基本上沒用直接用過。

typedef const void* objc_objectptr_t;

OBJC_EXPORT id _Nullable objc_retainedObject(objc_objectptr_t _Nullable obj) OBJC_UNAVAILABLE("use CFBridgingRelease() or a (__bridge_transfer id) cast instead");

OBJC_EXPORT id _Nullable objc_unretainedObject(objc_objectptr_t _Nullable obj) OBJC_UNAVAILABLE("use a (__bridge id) cast instead");

OBJC_EXPORT objc_objectptr_t _Nullable objc_unretainedPointer(id _Nullable obj) OBJC_UNAVAILABLE("use a __bridge cast instead");

最后俗扇,是基于基本類型聲明的幾個(gè)有意義的別名及對(duì)上面部分函數(shù)的簡化宏定義硝烂。到這一步,我們?cè)谌粘5腛bjc工作中狐援,常用到的Class钢坦,id, SEL, 及IMP都已經(jīng)展示在了我們面前。同時(shí)我們也應(yīng)該關(guān)心一下Nil與nil啥酱,盡量不要將二者不加區(qū)分混用。這片文章厨诸,到此結(jié)束镶殷。在后續(xù)的文章中,我們將以這邊文章的內(nèi)容為點(diǎn)不斷地進(jìn)行擴(kuò)散微酬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绘趋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颗管,更是在濱河造成了極大的恐慌陷遮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦江,死亡現(xiàn)場離奇詭異帽馋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)比吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門绽族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衩藤,你說我怎么就攤上這事吧慢。” “怎么了赏表?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵检诗,是天一觀的道長。 經(jīng)常有香客問我瓢剿,道長逢慌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任跋选,我火速辦了婚禮涕癣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己坠韩,他們只是感情好距潘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只搁,像睡著了一般音比。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氢惋,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天洞翩,我揣著相機(jī)與錄音,去河邊找鬼焰望。 笑死骚亿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熊赖。 我是一名探鬼主播来屠,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼震鹉!你這毒婦竟也來了俱笛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤传趾,失蹤者是張志新(化名)和其女友劉穎迎膜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浆兰,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磕仅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镊讼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宽涌。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝶棋,靈堂內(nèi)的尸體忽然破棺而出卸亮,到底是詐尸還是另有隱情,我是刑警寧澤玩裙,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布兼贸,位于F島的核電站,受9級(jí)特大地震影響吃溅,放射性物質(zhì)發(fā)生泄漏溶诞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一决侈、第九天 我趴在偏房一處隱蔽的房頂上張望螺垢。 院中可真熱鬧,春花似錦、人聲如沸枉圃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孽亲。三九已至坎穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間返劲,已是汗流浹背玲昧。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篮绿,地道東北人孵延。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像搔耕,于是被迫代替她去往敵國和親隙袁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉弃榨,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評(píng)論 0 9
  • runtime 是什么? runtime 又叫做運(yùn)行時(shí)梨睁,是一套底層的 C 語言API鲸睛,其為 iOS 內(nèi)部的核心之一...
    iChuck閱讀 251評(píng)論 0 0
  • 技術(shù)無極限,從菜鳥開始坡贺,從源碼開始官辈。 由于公司目前項(xiàng)目還是用OC寫的項(xiàng)目,沒有升級(jí)swift 所以暫時(shí)SDWebI...
    充滿活力的早晨閱讀 12,646評(píng)論 0 2
  • 上面一篇文章沒有分析完yymodel 遍坟。 接著上篇接著分析 static void ModelSetValueFo...
    充滿活力的早晨閱讀 1,056評(píng)論 0 0
  • 以三個(gè)月為一個(gè)周期拳亿,看到你的英文長起來,長起來愿伴。老外看過來肺魁,一起辦English corner。 怎么玩隔节? 錄荔枝...
    追咪閱讀 373評(píng)論 0 0