iOS 底層探索: alloc & init

iOS 底層探索: 學習大綱 OC篇

前言

  • 目前打算深入一下OC和Swift的底層探究剂碴,希望自己有所提升蹦渣,并能分享一些收獲球拦。

這篇主要記錄:通過查看objc的源碼探索alloc&init

  • 在這里給大家介紹一位大牛已經(jīng)配置好的源碼GitHub蔚鸥,我們直接下載就可以使用了动雹。

1. 下載之后焰薄,經(jīng)過一些配置拿诸,真機編譯 ,然后來到如下調(diào)試界面

注:allocwithZone 基本被舍棄沒用了塞茅;一般情況下 alloc 和 allocwithZone 的作用是一樣的亩码,alloc和allocWithZone都可以用于創(chuàng)建實例,實際上alloc會默認調(diào)用allocWithZone方法野瘦;

2.接下來我們來到:_class_createInstanceFromZone (類從區(qū)域創(chuàng)建實例)方法里面 這里有三個重要步驟


注:

  • a. 可以發(fā)現(xiàn)alloc具有申請內(nèi)存空間描沟、創(chuàng)建對象并給指針賦予地址的能力;
  • b. 獲取實例的內(nèi)存空間大小:cls->instanceSize()
  • c. 根據(jù)內(nèi)存大小鞭光,分配內(nèi)存空間吏廉,讓實例指向內(nèi)存開始地址:calloc
  • d. 關聯(lián)isa,實例的isa指向類:obj->initInstanceIsa(cls, hasCxxDtor)
  • e:關于word_align字節(jié)對齊 (x + WORD_MASK) & ~WORD_MASK這個算法是為了讓isa對象需要的內(nèi)存空間是8的倍數(shù)-8字節(jié)對齊惰许,mallocSize系統(tǒng)分配的內(nèi)存大小是16字節(jié)對齊的計算屬性方法等席覆。作用:內(nèi)存對齊,讓CPU讀取更加方便,用空間來換取時間

3 .總結alloc 全部流程(來自百度):

alloc

4.探索init汹买,new方法

id _objc_rootInit(id obj)
{
    return obj;
}

返回的就是alloc出來的obj佩伤。

- (id)init {
    return _objc_rootInit(self);
}

init沒做任何操作,一般在這里是工廠方式來重寫方法晦毙,自定義畦戒,我們經(jīng)常會這樣寫代碼

- (instancetype)init{
    self = [super init];
    if (self) {
         [self doSomething];
    }
    return self;
}
//


[super init] 重寫父類的方法 防止覆蓋父類的方法

self =  [super init]  

= 是確認繼承父類 可以延伸自己的方法

if(self)做判斷處理 防止父類在init的時候return nil 

做一個安全的處理 不然子類的實現(xiàn)就沒有意義了

通過源碼,看出new就是callAlloc+init的組合實現(xiàn)

+ (id)new {
    return [callAlloc(self, false/*checkNil*/) init];
}

5. 拓展:

  • 編譯優(yōu)化:fastpath 结序、slowpath 進行是否需要編譯優(yōu)化的判斷 障斋,release模式下都會進行編譯優(yōu)化,執(zhí)行fastpath判斷, 作用:減少編譯時間垃环,鏈接時間邀层,運行時間,優(yōu)化空閑時間遂庄;
    轉載:iOS 查看項目編譯時間并優(yōu)化編譯速度方法
  • 打印語句記錄:
    popp表示"expression"——打印對象指針;
    po是"expression -O"——打印對象本身;
    x/4gx對象 ——表示輸出4個16進制的8字節(jié)地址空間(x表示16進 制寥院,4表示4個,g表示8字節(jié)為單位涛目,等同于x/4xg 對象);
    x 對象——表示以16進制打印對象內(nèi)存地址(x表示16進制);

6. 總結:

通過查看objc的源碼探索alloc&init秸谢,我們可以大致看清alloc的執(zhí)行步驟,這篇主要講了其整體的流程霹肝,主要核心就是來到_class_createInstanceFromZone 估蹄,這個方法告訴我們內(nèi)存是如何開辟的,內(nèi)存是如何分配的沫换,當前類和指針地址的關系臭蚁。接下再來深入探索,開辟分配內(nèi)存的細節(jié)和對象中的屬性對內(nèi)存分配的影響讯赏。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垮兑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漱挎,更是在濱河造成了極大的恐慌系枪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磕谅,死亡現(xiàn)場離奇詭異嗤无,居然都是意外死亡,警方通過查閱死者的電腦和手機怜庸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門当犯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人割疾,你說我怎么就攤上這事嚎卫。” “怎么了宏榕?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵拓诸,是天一觀的道長。 經(jīng)常有香客問我麻昼,道長奠支,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任抚芦,我火速辦了婚禮倍谜,結果婚禮上迈螟,老公的妹妹穿的比我還像新娘。我一直安慰自己尔崔,他們只是感情好答毫,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著季春,像睡著了一般洗搂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上载弄,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天耘拇,我揣著相機與錄音,去河邊找鬼宇攻。 笑死惫叛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的尺碰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼译隘,長吁一口氣:“原來是場噩夢啊……” “哼亲桥!你這毒婦竟也來了?” 一聲冷哼從身側響起固耘,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤题篷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厅目,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體番枚,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年损敷,在試婚紗的時候發(fā)現(xiàn)自己被綠了葫笼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拗馒,死狀恐怖路星,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诱桂,我是刑警寧澤洋丐,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站挥等,受9級特大地震影響友绝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜肝劲,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一迁客、第九天 我趴在偏房一處隱蔽的房頂上張望郭宝。 院中可真熱鬧,春花似錦哲泊、人聲如沸剩蟀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽育特。三九已至,卻和暖如春先朦,著一層夾襖步出監(jiān)牢的瞬間风瘦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工悯姊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留池颈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓刺彩,卻偏偏與公主長得像迷郑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子创倔,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353