本篇文章主要介绍了" NSObject 底层本质",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下:
一、OC 转 C/C++二、NSObject 对象内存布局三、NSObject 内存大小四、OC 对象内存布局五、OC 对象内存大小一、OC 转 C/C++OC...
内存布局大概是这样,stu 指针指向结构体地址,结构体地址即为首个成员变量的地址。

4.2 继承对象
如果是 Person 继承自 NSObject ,Student 继承自 Person 类,Person 中包含 age 成员变量, Student 包含 no 成员变量,则底层实现结构如下图。

表面上看 Person_IMPL 占据 8 + 4 = 12 个字节,但是 OC 中明确指出一个 NSObject 对象大小至少为 16 字节。从内存对齐角度分析来看,Person_IMPL结构体也至少为 16 字节,即结构体的大小必须是最大成员的倍数,即8 * 2 = 16。
表面上看 Student_IMPL 占据 16 + 4 = 20 个字节实际并非如此,应该为 16 字节。因为 Student_IMPL 中虽然包含Person_IMPL,但是在继承关系中,Person_IMPL中 age 对应的内存空间并未被使用,所以应该是 8 + 4 + 4 = 16 字节。
五、OC 对象内存大小
@interface MJPerson : NSObject
{
int _age;
int _height;
int _no;
}
@end
MJPerson *p = [[MJPerson alloc] init];
NSLog(@"%zd %zd",class_getInstanceSize([MJPerson class]), malloc_size((__bridge const void *)(p))); // 24 32
p 对象对应的结构体为:
struct MJPerson_IMPL {
struct NSObject_IMPL NSObject_IVARS;
int _age;
int _height;
int _no;
}; // 计算结构体大小,内存对齐,24
上述代码打印结果分别为 24 和 32,按照前面所说的结构体内存对齐原则来说,打印结果应该都为 24,即 8 的最小倍数, 8 * 3 = 24。class_getInstanceSize为结构体内存大小 8 + 4 + 4 + 4 = 24,但和实际情况确有一些出入。