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对象内存布局
当动态的添加一个方法的时候
联合union
联合(union)是一个能在同一个存储空间里(但不同时)存储不同类型数据的数据类型。