iOS底層-對象的本質(zhì)

蘋果官方文檔是最正確的學(xué)習(xí)姿勢

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.
Objective-C語言盡可能多地推遲從編譯時鏈接時運(yùn)行時的決策滚粟。只要有可能烙荷,它就會動態(tài)地執(zhí)行操作司志。這意味著該語言不僅需要編譯器距芬,還需要運(yùn)行時系統(tǒng)來執(zhí)行編譯后的代碼疚颊。運(yùn)行時系統(tǒng)作為Objective-C語言的一種操作系統(tǒng);這就是語言的工作原理。

圖片.png

首先今天寫這篇博客是對學(xué)習(xí)的記錄

那么什么是運(yùn)行時?什么叫編譯時?

  • 編譯時顧名思義就是正在編譯的時候.那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機(jī)器能識別的代碼.(當(dāng)然只是一般意義上這么說,實(shí)際上可能只是翻譯成某個中間狀態(tài)的語言)
    編譯時就是簡單的作一些翻譯工作,比如檢查老兄你有沒有粗心寫錯啥關(guān)鍵字了啊.有啥詞法分析,語法分析之類的過程.就像個老師檢查學(xué)生的作文中有沒有錯別字和病句一樣.如果發(fā)現(xiàn)啥錯誤編譯器就告訴你.如果你用微軟的VS的話,點(diǎn)下build.那就開始編譯,如果下面有errors或者warning信息,那都是編譯器檢查出來的.所謂這時的錯誤就叫編譯時錯誤,這個過程中做的啥類型檢查也就叫編譯時類型檢查,或靜態(tài)類型檢查(所謂靜態(tài)嘛就是沒把真把代碼放內(nèi)存中運(yùn)行起來,而只是把代碼當(dāng)作文本來掃描下).所以有時一些人說編譯時還分配內(nèi)存啥的肯定是錯誤的說法.

  • 所謂運(yùn)行時就是代碼跑起來了.被裝載到內(nèi)存中去了.(你的代碼保存在磁盤上沒裝入內(nèi)存之前是個死家伙.只有跑到內(nèi)存中才變成活的).而運(yùn)行時類型檢查就與前面講的編譯時類型檢查(或者靜態(tài)類型檢查)不一樣.不是簡單的掃描代碼.而是在內(nèi)存中做些操作,做些判斷.

對象的本質(zhì)

我現(xiàn)在就來測試 : 下面是一個LGPerson對象

LGPerson *p = [LGPerson new];
clang -rewrite-objc main.m -o mian.cpp

因?yàn)槲覀兌贾繭C底層是C,我們進(jìn)一步可以編譯C++代碼(重寫)

C++編譯

通過C++編譯 我的天啊. 9851行代碼嚇我一哆嗦,不過沒關(guān)系.作為一名優(yōu)秀iOS底層開發(fā)人員,誰沒見過一萬行代碼似的!況且很多我都不需要考慮,里面有很多結(jié)構(gòu)體,都是一些引入,還有很多函數(shù),也不是我們關(guān)心的,我們把文件拖到最下面

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        LGPerson *p = ((LGPerson *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGPerson"), sel_registerName("new"));
        LGStudent*s = ((LGStudent *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGStudent"), sel_registerName("new"));
        ((void (*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("run"));
        ((void (*)(id, SEL))(void *)objc_msgSend)((id)s, sel_registerName("walk"));
    }
    return 0;
}

這就有點(diǎn)熟悉了,這不是我們main函數(shù)的編譯?
然后先不管下面的方法調(diào)用的編譯,我們?nèi)植檎?code>LGPerson

#ifndef _REWRITER_typedef_LGPerson
#define _REWRITER_typedef_LGPerson
typedef struct objc_object LGPerson;
typedef struct {} _objc_exc_LGPerson;
#endif

struct LGPerson_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
};

很明顯的一句話typedef struct objc_object LGPerson; 那么我們的LGPerson 就是objc_object類型的結(jié)構(gòu)體~~~那么我們所說的對象預(yù)計都是objc_object類型的結(jié)構(gòu)體!我們帶著好奇心繼續(xù)查看objc_object

struct objc_object {
    Class _Nonnull isa __attribute__((deprecated));
};

非常熟悉的身形isa 這個時候我就想到了另外一個東西NSObject

typedef struct objc_object NSObject;
struct NSObject_IMPL {
    Class isa;
};

我們的NSObjectisaobjc_object結(jié)構(gòu)體重的屬性在我們實(shí)現(xiàn)NSObject的時候只是對isa的重寫~~~isa也是我們后面后面學(xué)習(xí)非常重要的路線.比如我們編譯block也能看到isa,代表這個匿名函數(shù)也是對象,也重復(fù)符合萬物皆對象的說法!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锭汛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袭蝗,死亡現(xiàn)場離奇詭異唤殴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)到腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門朵逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乡范,你說我怎么就攤上這事配名。” “怎么了晋辆?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵渠脉,是天一觀的道長。 經(jīng)常有香客問我瓶佳,道長芋膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮为朋,結(jié)果婚禮上臂拓,老公的妹妹穿的比我還像新娘。我一直安慰自己潜腻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布器仗。 她就那樣靜靜地躺著融涣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪精钮。 梳的紋絲不亂的頭發(fā)上威鹿,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音轨香,去河邊找鬼忽你。 笑死,一個胖子當(dāng)著我的面吹牛臂容,可吹牛的內(nèi)容都是我干的科雳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼脓杉,長吁一口氣:“原來是場噩夢啊……” “哼糟秘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起球散,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤尿赚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕉堰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌净,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年屋讶,在試婚紗的時候發(fā)現(xiàn)自己被綠了冰寻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡皿渗,死狀恐怖性雄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羹奉,我是刑警寧澤秒旋,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站诀拭,受9級特大地震影響迁筛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一细卧、第九天 我趴在偏房一處隱蔽的房頂上張望尉桩。 院中可真熱鬧,春花似錦贪庙、人聲如沸蜘犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽这橙。三九已至,卻和暖如春导披,著一層夾襖步出監(jiān)牢的瞬間屈扎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工撩匕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹰晨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓止毕,卻偏偏與公主長得像模蜡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扁凛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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