OC 基础 - isa指针 和 superclasss

121 阅读2分钟

对象的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

自定义类似的结构体 通过 强制转换得到对应的结构体 查看数据接口 证明类的信息构成