XB OC物件的本質

2021-10-01 06:16:25 字數 2040 閱讀 1081

oc物件是基於c/c++的結構體實現的,可以用以下命令把oc檔案轉換成cpp檔案,這樣可以看到oc物件的結構體樣式

xcrun  -sdk  iphoneos  clang  -arch  arm64  -rewrite-objc  oc原始檔  -o  輸出的cpp檔案
以下都是基於64位環境

//oc樣式的

@inte***ce nsobject

@end

//結構體樣式的

struct nsobject_impl

//class實際上是乙個結構體指標

typedef struct objc_class *class;

從這裡可以看到,isa指標的位址其實就是指向初始化例項物件的指標的位址,類似於陣列第乙個元素的位址實際上就是整個陣列的位址。

1.乙個isa指標占用8個位元組,理論上說沒有成員變數的物件應該就是8個位元組,但是它底層有個限制,乙個物件如果小於16位元組,便讓該物件等於16位元組。

2.如果新增乙個int型別的成員變數呢

//oc樣式的

@inte***ce nsobject

@end

//結構體樣式的

struct nsobject_impl

這麼看應該是12位元組,其實應該還是16位元組,分配的16位元組那個isa指標只用了8位元組,還有8位元組空著呢。

3.如果繼承了某個類呢

/*nsobject*/

//oc樣式的

@inte***ce nsobject

@end

//結構體樣式的

struct nsobject_impl

/*------------------------------person------------------------------------*/

//oc樣式的

@inte***ce person

@end

//結構體樣式的

struct person_impl

/*------------------------------student------------------------------------*/

//oc樣式的

@inte***ce student

@end

//結構體樣式的

struct student_impl

其實student與person的記憶體都是16位元組,首先乙個空物件分配有16位元組,isa佔8位元組,在person中的age佔4位元組,還沒有佔完,在student中的no佔4位元組,正好佔完整個16位元組。

有點類似於這樣

//oc樣式的

@inte***ce student

@end

//結構體樣式的

struct student_impl

4.檢視記憶體

建立乙個例項物件至少需要多少記憶體(是根據結構體內存對齊之後的大小)

#import class_getinstancesize([nsobject class]);
建立乙個例項物件實際上分配了多少記憶體(是根據記憶體塊對齊分配的,底層有個buckets sized,會根據結構體對齊之後的記憶體分配乙個合適的16的倍數的記憶體塊)

#import malloc_size((__bridge const void *)obj);
關於這兩個的區別,例如

//oc樣式的

@inte***ce student

@end

//結構體樣式的

struct student_impl//結構體內存對齊之後需要24位元組

這裡class_getinstancesize的結果是24,但是它不是16的倍數,所以malloc_size是32

物件導向 類的本質

類的概念和物件的概念是緊密交織在一起的,因為我們在談論乙個類物件時不得不提到它的類,但是類和物件偏偏又有著重要差別。物件是存在於時間和空間中存在的具體實體,而類僅僅代表一種抽象,即乙個物件的本質。類是一組物件,它們擁有共同的結構,共同的行為和共同的語義。沒有共同的結構 共同的行為 共同的語義的物件不...

本質啊本質之四 陣列的本質

陣列 1.陣列是同型別的聚合 2.定義乙個陣列,如 type x n 意思是記憶體裡有 n個連續的 type 型變數,連續的排列在一起。x 是第乙個元素的位址,是乙個立即數,是右值,不是變數。x x 0 這是編譯器處理的,因為當你將 x 賦值給乙個指標時 編譯器實際上就用的 x 0 3.多維陣列也是...

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

ios底層原理總結 oc物件的本質 一 掘金 ios底層原理總結 oc物件的本質 二 掘金 ios底層原理總結 oc物件的分類 instance class meta calss物件的isa和superclass 掘金 ios底層原理總結 kvo kvc的本質 掘金 思考 如果我的student有三...