隨便說說 alloc 和 init

2021-09-23 20:29:29 字數 2487 閱讀 7906

先丟擲乙個小問題,然後延伸引入接下來要說的

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我們現在正是開始今天的內容

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

繼續往下

繼續

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

簡單說明

咱們繼續往下

繼續往下

好了 劃重點了開始

重點1.      size_t size = cls->instancesize(extrabytes);     6518行

建立物件首先最重要的大家應該都知道啦  ,  記憶體 , 對吧. 這個 size 就是獲取該物件需要多大的空間,從而進行位元組對齊

(位元組對齊簡單來說就是 ,比如改物件需要12個位元組, 那麼就返回16位元組 .如果該物件需要23個位元組,那麼就返回24位元組 . 為什麼要對齊?  玩過逆向,彙編或者研究過底層的朋友就比較理解這個,在這咱們就不多說了)

5.1獲取該物件所需要的空間

5.2呼叫演算法計算出所需要的記憶體空間

這是 alloc 做的第一件事 .計算並進行位元組對齊.

咱們繼續丟擲乙個問題,比如現在有個 zuyuclass 的類.  有nsstring 型別的 name(8位元組) 和 int 型別的 age(4位元組) .根據位元組對齊. 這個類的物件占用了多少位元組的記憶體?

腦袋裡邊想著是16的,可以用**輸出一下 看一下 , 是24 .問題又來了 ,為什麼是24個位元組

重點2.        obj->initinstanceisa(cls, hascxxdtor)   6525行.

建立乙個 isa.  isa 占用了8個位元組 . 萬物皆物件,物件皆有 isa

物件皆有 isa

ok.這個時候大家是不是就以為zuyuclass在記憶體中就占用24個位元組了?

no,nonono .重點3來了  ——> obj = (id)calloc(1, size);   6523行

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

calloc進行的記憶體對齊

16倍數對齊

所以最終 zuyuclass 的這個物件記憶體中占用的空間是32位元組而不是24位元組

alloc我們就說到這裡

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

來,我們看一眼原始碼

init原始碼

rootinit

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

所以也就解釋了一開始丟擲的問題  .是不是看到這裡已經顛覆了你的 alloc 是開闢空間,init 是初始化的理解?

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

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

那麼現在最後丟擲乙個問題

在建立某乙個類的物件的時候,alloc 和 init 分別起到了什麼作用. 是不是瞬間感覺腦海裡的回答比之前高大上了許多 

隨便說說removeFromSuperview方法

專欄作者。之前寫過一篇關於removefromsuperview方法處理的文章,寫完後一直就沒怎麼更新這篇文章。這兩天回過頭來看看,感覺這篇文章有些地方寫的不夠嚴謹,而且還有一些自己理解錯的地方,所以打算重寫這篇文章。在使用removefromsuperview方法的時候,發現這個方法有很多我們沒有...

我來隨便說說

好久沒來兄弟連bbs了,隨便說說 正文 來兄弟連大約有895小時了,感觸也挺多.來之前 時不時地上網玩遊戲,而且生活也很不規律,根本都不敢想象以後會怎樣.可能買苦力.其實 我玩過之後有一種 罪惡感.一覺睡到12點也是常有的,感覺大學學不到什麼東西,一直想找個環境來鍛鍊自己,現在我想我找到了.起初來的...

隨便說說的題

題目描述 兔子,兔子,和很多新的兔子。乙隻兔子每天會生下 k kk 只兔子。生下來的小兔子,從第二天開始就會變成大兔子,並且生產。舉例,k 1 k 1k 1 時,兔子數量在前三天分別是 1 11 只兔子 1 11 隻大兔 1 11 只小兔 2 22 隻大兔 2 22 只小兔。現在蘇蘇正在研究這群兔子...