iOS底層原理總結 OC物件的本質 二

2021-09-05 11:31:23 字數 2019 閱讀 8543

ios底層原理總結–oc物件的本質(一) - 掘金

ios底層原理總結–oc物件的本質(二) - 掘金

ios底層原理總結–oc物件的分類:instance、class、meta-calss物件的isa和superclass - 掘金

ios底層原理總結-- kvo/kvc的本質 - 掘金

思考: 如果我的student有三個成員變數 那麼會占用對少個位元組? (class_getinstancesize([student class]) 的輸出是多少? malloc_size((__bridge const void *)stu的輸出是多少? )

#import #import ///> student類

@inte***ce student: nsobject

///> 實際底層的結構體 結構

//struct student_impl

@end

@implementation student

@end

///> main

int main(int argc, char * argv)

return 0;

}

首先**下一為什麼malloc_size的輸出為32 ?

可以使用xcode自帶的工具去檢視 系統分配的記憶體和使用的記憶體情況。

然後選擇:debug --> degug workflow --> view memory

在下方的位置輸入我們剛剛得到的記憶體位址後就可以了,stu的記憶體結構如上圖所示

直到紅線的位置都是stu所開闢的儲存空間,直到紅色數線後才有了新的值, 在之前都是00值而且在記憶體中記憶體是連續的, 所以我們可以認為,直到紅色豎線位置之前都是stu所分配的儲存空間

如上圖所示

由上圖分析:我們可以得出 stu實際上在記憶體中分配了32個位元組的記憶體空間 也就是 malloc_size() 所輸出的開闢記憶體空間的位元組數。

接下來**下一為什麼class_getinstancesize的輸出為24 ?

class_getinstancesize 顧名思義 獲取類的例項大小

isa占用8個 + _no:4個 + _age4個 + _gender4個

@inte***ce student: nsobject ///  計算相加後  為20個,
結構體存在乙個記憶體對其的操作,這樣有利於cpu的訪問,

在co中用到的記憶體對其的一條規則就是:

結構體為了保證記憶體對其 最重的真用記憶體一定是占用最大的乙個變數的倍數, 在這裡我們isa占用了8個位元組數, 所以雖然實際上只使用了20個位元組,但是為了保證記憶體對其的規則 所以使用了24個位元組,

如果我們有4個成員變數的話:

@inte***ce student: nsobject ///  計算相加後  為24個,
我們真用的記憶體還是24,開闢依舊是32個位元組。如果在增加乙個成員變數的話:

@inte***ce student: nsobject ///  計算相加後  為28個,
為了保證記憶體對其所以大小為32個位元組,開闢依舊是32個位元組。malloc_size() 也運用了記憶體對其的 上篇文章中解釋了為什麼給類的記憶體分配了16個位元組, 由於記憶體對其的原因所以stu類分配了32個位元組。

iOS底層原理總結 OC物件的本質 一

窺探ios底層實現 oc物件的本質 一 掘金 窺探ios底層實現 oc物件的本質 二 掘金 窺探ios底層實現 oc物件的分類 instance class meta calss物件的isa和superclass 掘金 窺探ios底層實現 kvo kvc的本質 掘金 int main int arg...

iOS底層原理總結 OC方法的本質

int main int argc,const char argv return 0 可以看出在我們進行lgperson初始化的時候,我們都知道會呼叫alloc,init.我這裡為了簡單只呼叫 new 但是底層不是像我們利用呼叫的,而是呼叫了乙個函式objc msgsend這就是我們訊息傳送的方法,...

iOS 類的底層原理

首先我們探索來例項物件 類物件 元類之間的關係,執行下面 可以看到class1 class2 class3列印結果一樣,我們是不是可以認為類物件只有乙個,元類是乙個虛擬的類由系統幫我們建立,是類物件所屬的類,而元類歸屬是根元類,根元類的歸屬是自身。例項物件 person p person alloc...