隨便說說 alloc 和 init

先拋出一個小問題,然后延伸引入接下來要說的

zuyuClass *z = [zuyuClass alloc];

zuyuClass *z1 = [z init];

zuyuClass *z2 = [z init];

NSLog(@"%p - %p - %p",z,z1,z2);

思考一下是控制臺的輸出是怎么樣的

思考過后代碼試一下

z,z1,z2三個對象的地址是完全一樣的

alloc 做了些什么?init 做了些什么?

OK我們現(xiàn)在正是開始今天的內(nèi)容

想知道 alloc 都干了些什么.最簡單的方式就是看源碼對吧.來,咱們瞄一眼源碼去


1

繼續(xù)往下

2

繼續(xù)

3

好,到這里簡單說一下,會走到紅色選中的位置,為什么會走到這兒呢? 通過下符號斷點,顯示的匯編中看出來,這咱們就簡單的一句帶過,不詳細說.

簡單說明

咱們繼續(xù)往下

class_createInstance

4

繼續(xù)往下


5

好了 劃重點了開始

重點1. ?? ? size_t size = cls->instanceSize(extraBytes); ? ? 6518行

創(chuàng)建對象首先最重要的大家應該都知道啦 ?, ?內(nèi)存 , 對吧. 這個 size 就是獲取該對象需要多大的空間,從而進行字節(jié)對齊

(字節(jié)對齊簡單來說就是 ,比如改對象需要12個字節(jié), 那么就返回16字節(jié) .如果該對象需要23個字節(jié),那么就返回24字節(jié) . 為什么要對齊? ?玩過逆向,匯編或者研究過底層的朋友就比較理解這個,在這咱們就不多說了)

5.1獲取該對象所需要的空間


5.2調(diào)用算法計算出所需要的內(nèi)存空間

這是 alloc 做的第一件事 .計算并進行字節(jié)對齊.

咱們繼續(xù)拋出一個問題,比如現(xiàn)在有個 zuyuClass 的類. ?有NSString 類型的 name(8字節(jié)) 和 int 類型的 age(4字節(jié)) .根據(jù)字節(jié)對齊. 這個類的對象占用了多少字節(jié)的內(nèi)存?

腦袋里邊想著是16的,可以用代碼輸出一下 看一下 , 是24 .問題又來了 ,為什么是24個字節(jié)

重點2.? ? ? ? obj->initInstanceIsa(cls, hasCxxDtor) ? 6525行.

創(chuàng)建一個 isa. ?isa 占用了8個字節(jié) . 萬物皆對象,對象皆有 isa


對象皆有 isa

ok.這個時候大家是不是就以為zuyuClass在內(nèi)存中就占用24個字節(jié)了?

NO,NONONO .重點3來了 ?------>?obj = (id)calloc(1, size); ? 6523行

這個 calloc 最終會走到這里(下圖)


calloc進行的內(nèi)存對齊


16倍數(shù)對齊

所以最終 zuyuClass 的這個對象內(nèi)存中占用的空間是32字節(jié)而不是24字節(jié)

alloc我們就說到這里

接下來簡單說說 init. 為什么要簡單說說呢,因為沒辦法詳細說啊

來,我們看一眼源碼


init源碼


rootinit

看到了吧 .init 干嘛了?init 啥都沒干!只是返回了自己!

所以也就解釋了一開始拋出的問題 ?.是不是看到這里已經(jīng)顛覆了你的 alloc 是開辟空間,init 是初始化的理解?

可能有同學要問一下,init 既然啥都沒干,為啥還要 init 這個方法,要它何用?

一句話回答, 自定義初始化. 也就是重寫 init. ?

那么現(xiàn)在最后拋出一個問題

在創(chuàng)建某一個類的對象的時候,alloc 和 init 分別起到了什么作用. 是不是瞬間感覺腦海里的回答比之前高大上了許多?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潘拨,一起剝皮案震驚了整個濱河市呜投,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栽烂,老刑警劉巖驱证,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件延窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡抹锄,警方通過查閱死者的電腦和手機逆瑞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伙单,“玉大人获高,你說我怎么就攤上這事∥怯” “怎么了谋减?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扫沼。 經(jīng)常有香客問我出爹,道長,這世上最難降的妖魔是什么缎除? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任严就,我火速辦了婚禮,結(jié)果婚禮上器罐,老公的妹妹穿的比我還像新娘梢为。我一直安慰自己,他們只是感情好轰坊,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布铸董。 她就那樣靜靜地躺著,像睡著了一般肴沫。 火紅的嫁衣襯著肌膚如雪粟害。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天颤芬,我揣著相機與錄音悲幅,去河邊找鬼套鹅。 笑死,一個胖子當著我的面吹牛汰具,可吹牛的內(nèi)容都是我干的卓鹿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼留荔,長吁一口氣:“原來是場噩夢啊……” “哼吟孙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起聚蝶,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拔疚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后既荚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡栋艳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年恰聘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吸占。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡晴叨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾屯,到底是詐尸還是另有隱情兼蕊,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布件蚕,位于F島的核電站孙技,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏排作。R本人自食惡果不足惜牵啦,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妄痪。 院中可真熱鬧哈雏,春花似錦、人聲如沸衫生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罪针。三九已至彭羹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泪酱,已是汗流浹背皆怕。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工毅舆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愈腾。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓憋活,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虱黄。 傳聞我的和親對象是個殘疾皇子悦即,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359