iOSiOSios开发

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

2019-03-27  本文已影响20人  stevenzzzz吻

一个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程序的内存布局

上一篇下一篇

猜你喜欢

热点阅读