iOS原理

OC对象内存布局

2018-03-15  本文已影响152人  Scott丶Wang

Q:

属性、变量、变量的值、类方法、对象方法怎么布局?
元类、类对象、实例对象、根类之间的关系?

A:

属性(包括父类的属性)都保存在实例对象自身的存储空间内;
本类的实例方法保存在类对象中,本类的类方法保存在元类对象中;
父类的实例方法保存在各级 super class 中,父类的类方法保存在各级 super meta class 中

首先需要知道,OC方法的调用本质是消息发送(objc_msgSend),消息查找过程又如何呢?实例对象调用实例方法的时候,首先根据isa指针找到所属的类(类对象)中方法缓存映射表中查找,没有找到再到方法列表中查找,还是没有找到的话就沿着继承体系向上查找直到NSObject,这一部还没有找到的话,用户还有三次机会进行消息转发(动态分析、备援接受者、完整的消息转发),如果到这里还没有处理消息,就只能报错了;类对象调用类方法的时候,思路是一样的,只不过是根据isa指针找到属的元类,重复上面的步骤。

实例变量的定义如下,它包含了变量的名称、类型、偏移等,但却不包括变量的值——值在对象而非类中:

struct objc_ivar  {
    char *ivar_name  OBJC2_UNAVAILABLE;
    char *ivar_type  OBJC2_UNAVAILABLE;
    int ivar_offset  OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space        OBJC2_UNAVAILABLE;
#endif
}

最后是一张图简明扼要的指出了OC对象内存布局


OC对象内存布局图.png

当动态的添加一个方法的时候


动态添加方法.png

联合union

联合(union)是一个能在同一个存储空间里(但不同时)存储不同类型数据的数据类型。

结构体间强制转换

学习资料
从 NSObject 的初始化了解 isa
深入解析 ObjC 中方法的结构
Objc 对象的今生今世

上一篇下一篇

猜你喜欢

热点阅读