iOS底层原理(从面试题来慢慢深入)
一个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、再调用编译先后顺序调用(先编译先调用)