OC物件的本質
一個NSObject物件佔用多少記憶體?
由這個問題可以引出更多底層的東西。在這裡要搞清楚NSObject物件在記憶體中的佈局,就要明白OC物件的本質。
那麼如何將Objective-C程式碼轉換成C\C++程式碼呢?
直接用命令列轉換
clang -rewrite-objc main.m -o main.cpp
區分平臺 轉成相對應平臺的c++檔案xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc mian.m -o main-arm64.cpp
檢視本質
圖上可以看出OC物件的本質就是結構體,那麼結構體在記憶體中佔的大小分別是8個位元組(64位系統)、4個位元組(32位系統)。
問:一個NSObject物件是不是也是8個位元組(預設64位的)?
通過程式碼檢視一下:
NSObject *obj = [[NSObject alloc]init];
//獲取NSObject類的例項物件的成員變數所佔用的大小>>8 至少需要多少位元組
NSLog(@"%zd",class_getInstanceSize([NSObject class]));//8個位元組
//獲得obj指標指向記憶體的大小>>16 實際分配了多少記憶體
NSLog(@"%zd",malloc_size((__bridge const void*)obj));//16個位元組
答案:16個位元組
- 系統分配了16個位元組的空間給NSObject物件(通過malloc_size函式獲得)
- 但是NSObject物件內部只使用了8個位元組空間(64bit環境下,通過class_getInstanceSize函式獲得)
- 檢視原始碼可以看到,Core Foundation 框架規定最小是16個位元組
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}
新建一個Student類並申明兩個成員變數檢視它的底層結構
記憶體對齊:結構體的大小必須是最大成員大小的倍數
iOS分配記憶體空間都是16的倍數。例如你需要24個位元組,但是系統會分配32個位元組
sizeof():相當於運算子,不是一個函式,編譯時已確定值
物件的isa指標指向哪裡?
答案:
- instance物件的isa指向class物件
- class物件的isa指向meta-class物件
- meta-class的isa指向基類的meta-class物件
OC的類資訊存放在哪裡?
答案:
- 物件方法、屬性、成員變數資訊(名字 型別等)、協議資訊存在在class物件中
- 類方法存放在meta-class物件中
- 成員變數的具體值,存放在instance物件中
相關文章
- OC原始碼剖析物件的本質原始碼物件
- MJiOS底層筆記--OC物件本質iOS筆記物件
- MJiOS底層筆記–OC物件本質iOS筆記物件
- iOS底層原理總結--OC物件的本質(一)iOS物件
- iOS底層原理總結--OC物件的本質(二)iOS物件
- iOS底層原理總結 – 探尋OC物件的本質iOS物件
- iOS底層原理總結 - 探尋OC物件的本質iOS物件
- Category的本質<三>關聯物件Go物件
- Objective-C 物件導向(一)——物件的本質Object物件
- IOS 底層原理 物件的本質--(1)iOS物件
- 關聯物件的實現原理【OC】物件
- OC物件是結構體的驗證物件結構體
- ARC下OC物件和CF物件之間的橋接(bridge)物件橋接
- OC物件記憶體佈局物件記憶體
- 遊戲設計的本質(一):數值的本質遊戲設計
- OC底層原理之例項、類物件、元類物件物件
- OC記憶體管理--物件的生成與銷燬記憶體物件
- Category的本質<一>Go
- 學習的本質
- 聊聊 ChatGPT 的本質ChatGPT
- Battle Pass的本質BAT
- 淺談OC物件初始化的三種姿勢物件
- 分析oc物件的記憶體結構及其建立過程物件記憶體
- 金融交易的本質
- jmp跳轉的本質
- 人生規劃的本質
- 矩陣合同的本質矩陣
- 從缺陷率到質效工作的本質
- 關於物件導向和麵向過程本質的區別(個人感悟)物件
- iOS進階之路 (三)OC物件的原理 - isa 結構 & 走位iOS物件
- Objective-C 類的本質Object
- Block學習①--block的本質BloC
- 架構設計的本質架構
- Rollup的本質是什麼?
- Vue中computed的本質—lazy WatchVue
- Category的本質<二>load,initialize方法Go
- 技術的本質與啟示
- Go slice切片的“陷阱”和本質Go