美文网首页iOSiOSios开发
iOS底层原理(从面试题来慢慢深入)

iOS底层原理(从面试题来慢慢深入)

作者: stevenzzzz吻 | 来源:发表于2019-03-27 17:24 被阅读20次

    一个NSObject对象占用多少内存?

    a、系统会分配16个字节给NSObject对象(导入<malloc/malloc.h>,通过malloc_size((__bridge const void *)obj)函数来获取,注意:结构体会有字节对其原则,所以内存都会是16的倍数)

    b、但是NSObject对象内部实际上只占用了8个字节(导入<objc/runtime.h>,64位环境下,通过class_getInstanceSize([NSObject class])函数获得,注意:同上根据字节对其原则,这个实际内存都会是8的倍数)


    对象的isa指针指向哪里?

    对于这个问题,首先你要弄懂以下问题

    对象分三种:实例对象instance、类对象class、元类对象meta-class,而且,三种对象中分别存储着以下内容

    由此,也引申出了class对象的superclass指针的指向

    例如:@interface Student :Person            @interface Person:NSObject

    那么你会发现他们的superclass指针的指向为下图所示

    再由此,引申出了meta-class对象的superclass指针的指向

    通过以上逐层分析,再看下图,Subclass=Student,Person=Superclass,NSObject=Rootclass,你是否会瞬间明白,唯一需要注意的就是根类的superclass指针指向的是根类的类对象


    +load方法的调用顺序

    首先,要明白的是,+load方法会在runtime加载类、分类时调用,而且每个类、分类的+load,在程序运行过程中只会调用一次,经过一波简单的分析源码得出

    调用顺序 

    1、先调用类的+load方法;

    a、按照编译先后顺序调用(先编译先调用)b、调用子类的+load方法之前,会先调用父类的+load方法

    2、再调用编译先后顺序调用(先编译先调用)


    iOS程序的内存布局

    相关文章

      网友评论

        本文标题:iOS底层原理(从面试题来慢慢深入)

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