- 系統(tǒng)分配給了16個(gè)字節(jié)給NSOject 對(duì)象, (通過(guò)malloc_size獲得)
2.但是NSObject 對(duì)象內(nèi)部使用8個(gè)字節(jié)的空間 (64位環(huán)境下, 可以通過(guò)class_getInstanceSize函數(shù)獲得)
獲取蘋(píng)果源碼地址
內(nèi)存對(duì)齊以及內(nèi)存對(duì)齊的規(guī)則

image.png

image.png
clang -rewrite-objc main.m -o main.cpp 將OC 改成C++文件 , 不是很建議使用這行代碼, 因?yàn)椴煌钠脚_(tái), 是 不一樣的
尤其是匯編語(yǔ)言, 依托于硬件, 所有我們可以 指定平臺(tái)
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 輸出的 cpp文件
xcrun : Xcode Run
struct NSObject_IMPL {
Class isa;
};

image.png

image.png

image.png
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>
//@interface Student : NSObject{
// int _age;
// double _height;
// NSString *_name;
//
//}
//
//
//
//
//@end
//
//@implementation Student
//
//
//
//@end
//C++
//struct NSObject_IMPL {
// Class isa; //8個(gè)字節(jié)
//};
//
//
main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSObject *obj = [[NSObject alloc] init];
//16 個(gè)字節(jié) , 真正利用起來(lái)的只有8個(gè)字節(jié)
/**
struct Student{
int age;
double height;
}
*/
//8 個(gè)字節(jié) 獲取類(lèi)的實(shí)例對(duì)象的大小 , 并不是真正分配的內(nèi)存大小, 返回的是類(lèi)的實(shí)例對(duì)象的成員變量所占的內(nèi)存大小
NSLog(@"%ld",class_getInstanceSize([NSObject class]));
//16個(gè)字節(jié), 返回指針?biāo)赶蚰沁厓?nèi)存的大小 獲得obj所指向的內(nèi)存的大小
NSLog(@"%ld", malloc_size((__bridge const void *)(obj)));
}
return 0;
``}
// CF requires all objects be at least 16 bytes. Foundation 框架下的源碼
if (size < 16) size = 16;

image.png

image.png

image.png

image.png

image.png

memory write(直接修改內(nèi)存地址).png
一個(gè)Student對(duì)象, 占用多少內(nèi)存??

image.png

image.png

image.png

image.png
iOS是小端模式, 高地址在后面

image.png

image.png

image.png

image.png

image.png
方法不放在實(shí)例對(duì)象里面. 因?yàn)閍lloc init 會(huì)創(chuàng)建不同的實(shí)例對(duì)象, 而方法是不變的, 方法存一份就好了