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

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

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

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


对象的isa指针指向哪里?

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

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

iOS底层原理(从面试题来慢慢深入)_第1张图片

(补充:注意,此处的类对象的成员变量,是主要存储其setter和getter方法的,这也是主要区别于分类为什么不能给成员变量赋值的关键(runtime的另算))
由此,也引申出了class对象的superclass指针的指向

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

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

iOS底层原理(从面试题来慢慢深入)_第2张图片

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

iOS底层原理(从面试题来慢慢深入)_第3张图片

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

iOS底层原理(从面试题来慢慢深入)_第4张图片

+load方法的调用顺序

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

iOS底层原理(从面试题来慢慢深入)_第5张图片

调用顺序 

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

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

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


iOS程序的内存布局

iOS底层原理(从面试题来慢慢深入)_第6张图片

你可能感兴趣的:(iOS底层原理(从面试题来慢慢深入))