对象的isa 指针指向哪里 ?
OC的类信息存放在哪里 ?
方法调用的本质是 objc_msgSend(person, @selector(调用的方法))
给对象发消息
instence isa --> class 当调用对象方法通过ISA 指针找到 class -号方法对象方法实现 进行调用;
class isa --> meta-Class 当调用类方法的时候 通过class 的isa指针 找到 metaClass 中的 +号 类方法 就行调用
instence superClasll - Class
class superClass - nsobject
meta-class 他的superClass 指针 指向的他的父类的metaClass
基类的元类的suoerclass 指向基类的类对象
方法的调用流程
[student abc];
通过实例对象的isa 找到 自己的 类对象 方法列表 , 如果有 就调用 如果没有 就 通过superclass 的类对象 找到 abc 如果有 就调用 没有就 通过 superclass 继续找
如果都没有 就找到基类 的类对象
如果 基类的类对象 没有这个方法就 会崩溃
如果 子类和 父类 用相同的方法 那么 不会执行父类的同名方法, 根据方法查找的本质原因 是不会通过superclass 继续寻找 父类的方法列表了
如果调用的是类方法 一直找不到的 话 会去基类的类对象中找方法, 此时基类的类对象如果实现了 -号的 实例对象方法 那么 会执行它
objc_messend (@selector(test)) 此处不会区分 加号和减法方法
**isa 指针的结构 **
lldb p/x (long)person->isa
lldb p/x personClass
类对象的地址 &2 = 0X0000000100014c8 实例对象的地址 &3 = 0X0000000100014c9
从 64 计算机系统开始
爱上MASK 实例对象 的 isa &ISA_MASK ---> 得到类对象的 地址
define ISA_MASK 0x0000000ffffffff8 类对象 & 上 这个MASK 得到 元类isa地址 define ISA_MASK 0x0007000ffffffff8
superClass 地址 是直接指向 父类的 不许要 & 上 MASK
结构体力有什么 ?
OBJC2 最新源码 c++ 中结构体可以继承 相当于类 几乎没区别 struct objc_class :objc_object { Class ISA;// Class superclass; Class cache; //方法缓存 Class_data_bits_t bits; // 获取具体的类信息
class_rw_t *data {
return bits.data(); &FAST_Data_MASK
}
}
bits 中包含 struct class_rw_t {
const class_ro_t *ro;
method_list_t * method_list; 方法列表
property_list_t *property_list; 属性列表
const protocol_list_t protocols; 协议列表
}
struct class_ro_t {
instanceSize; 对象占用的内存空间
const char *name ; 类名
method_list_t *basemethod_lis; 方法列表
property_list_t *baseproperty_list; 属性列表
protocol_list_t *baseprotocol_list;
const ivar_list_t *ivars; 成员变量列表
}
lldb x student 查看内存
OC编译 c++ 把 .m 转为.mm
自定义类似的结构体 通过 强制转换得到对应的结构体 查看数据接口 证明类的信息构成