美文网首页
OC对象的本质-继承关系

OC对象的本质-继承关系

作者: 凌云01 | 来源:发表于2020-09-26 09:59 被阅读0次

    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对象的本质-继承关系

          本文链接:https://www.haomeiwen.com/subject/lqdfuktx.html