OC对象的本质-继承关系

OC对象的本质
OC对象的本质-窥探OC对象内存结构
OC对象的本质-继承关系

先来看上一篇的问题
在64bit环境下,一个Person对象,一个Student对象占用多少内存呢?

@interface Person : NSObject
{
    int _no;
}
@end

@implementation Person
@end

@interface Student : Person
{
    int _age;
}
@end
@implementation Student
@end

这个问题里Person继承NSObject, Student继承Person


对象底层实现

通过转化看到底层实现每个对象的实现都包含的其父类的实现

struct NSObject_IMPL {
    Class isa;    //8个字节
};

struct Person_IMPL {
    struct NSObject_IMPL NSObject_IVARS; //8个字节
    int _no; //4个字节
};  //考虑到内存对齐:16个字节

struct Student_IMPL {
    struct Person_IMPL Person_IVARS;//16个字节
    int _age;//4个字节
};   //内存对齐:16个字节
  • NSObject_IMPL占用8字节
  • Person_IMPL中,NSObject_IMPL占用8字节, _no占用4字节,总共占用12字节,因为系统内存对齐原则,一个对象占用总字节应该是内存变量所占用最长字节数的整数倍,因此总共占用16字节
  • Student_IMPL中,Person_IMPL占用16字节,_age占用4个字节,因为Person_IMPL中成员实际使用12字节,那么考虑到内存对齐,_age可以放到Person_IMPL未使用的4个字节中,因此总占用16字节。

那么是否真的是这样呢?我们通过代码验证一下

 NSLog(@"%zd  %zd",
              class_getInstanceSize([Person class]),
              class_getInstanceSize([Student class])
              );

输出结果: 16 16
输出结果和分析一致。

上一篇:OC对象的本质-窥探OC对象内存结构

你可能感兴趣的:(OC对象的本质-继承关系)