一、政策的种类

OC中政策分为三种:

  • instance政策(实例政策): 经过类alloc出来的政策是实例政策, 每次alloc都会生成一个新的实例政策.

实例政策首要存储的信息包含: isa指针, 其他成员变量等

  • class政策(类政策): 类政策在内存中只会存储一份.

类政策首要存储的信息包含: isa指针, supercla宫颈癌前期症状ss 指针源码编辑器, 类的特征信息, 类的政策办法, 类的协议信息, 类的成员变量信息等

  • meta-class(元类政策): 元类方ios14针与类政策的ios模拟器结构类似, 在内存中也只要一份

元类政策ios14.4.2值得更新吗首要宫颈癌疫苗源码网站储的信息包含: isa指针, superclass指针, 类的类办法等

二、类政策的源码剖析

在objc源码中, 咱们能够找到类政策的完成代码, 中心代码如下:

struct objc_class : objc_object {
//ios体系 Class ISA; isa指针 继承自objc_iOSobject
Class superclagoogless; // superclass 指针
class_data_bit公积金s_t bits;    // 中心信息
class_rw_t *d源码分享网ata() const宫颈癌疫苗 {
return源码编辑器 bits.data();
}
// .... 其他代码
};

咱们能够看到, data()函数回来的是 class_rw_t 类型, 继续探求

struct class_rw_t {
// ...
private:
// 获取当时类 是ro 或者是 rwe
const ro_or_rw_ext_t get_ro_or_rwe() const {
return ro_or_rw_ext_t{ro_or_rw_ext};
}
// ...
public:
// rw 的扩展
class_rw_ext_t *ext() const {
return get_ro_or_rwe().ios14桌面布局图片dyn_cast<class_rw_ext_t *>(&源码之家ro_or_rw_ext);
}
// 获宫颈癌疫苗取当时类的 class_rw_ext_t宫颈癌, 在Category加载时狗狗币用到
class_rw_ext_t *extAllocIfNeeded() {
auto v = get_ro_or_rwe();
if (fastpath(v.is<class_rw_ext_t *>())) {
return v.get<class_rw_ext_t *>(&ro_or_rw_狗狗币ext);
} eios14.4.2值得更新吗lse {
return exgoogletAlloc(v.get<const公积金 class_ro_t *>(&源码码头amp;源码编辑器ro_or_rw_ext));
}
}
// ro 成员变量
const class_ro_t *ro() const {
auto v = get_ro_or_rwe();
if (slowpath(v.is<class_rw_ext_t *>())) {
return v.get<clios退款ass_rw_ext_t *>(&a公积金借款mp;ro_or_rw_ext)->ro;
}
return v.get&l宫颈癌前期症状t;const class_ro_t *>(&ro_or_rw_ext);
}
// 依据 ro_or_rwe(), 回来rw_ext的狗狗币methods成员 或 ro_t 的baseMethods
const method_array_t methods() const {
auto v = get_ro_or_rwe(源码码头);
if (v.is<宫颈癌前期症状class_rw_ext_t *>()) {
return v.getGo<class_rw_ext_t *>(&ios14.4.1更新了什么amp;ro_or_rw_ext)->meiOSthods;
} else {
return method_array_t源码分享网{v.get<const class_ro_t *>(&ro_or_r宫颈癌w_ext)->baseMethods()};
}源码分享网
}
// 依据 ro_orios是什么意思_rweios14.4.1更新了什么(), 回来rw_ext的properties成员 或 ro_t 的baseProperties
const property_array_t properties() const {
auto v = get_ro_or_rwe();
if (v.is<class_rw_eiOSxt_t *>()) {
return v.get<class_rw_ext_t *>(&公积金借款ro_or_rw_ext)->properties;
} else {
return property_array_t{v.get<const class_ro_t *>(&ro_or_源码年代rw_ext)->baseProperties};
}
}
// 依据 ro_or_rwe(), 回来rw_ext的protocols成员 或 ro_t 的baseProtocols
const proios8备忘录tocol_array_t protocols()公积金借款 const {源码编辑器手机版下载
auto v = get_ro_or_rwe();
if (枸杞v.is<class_rw_ext_t *>())狗狗币 {
return v.get<class_rw_ext_t *>(&ro_or_rw_ext)->protocols;
} else {
return protocol_array_t{v.get<const class_ro_t *>(&ro_or_rw_ext)->baseP源码本钱rotocols};
}
}
// ...
};

ios14桌面布局图片么咱们看下 class_rw_ext_t 分别是什么class_ro_t

// class_rw_ext_t
struct class_rw_eios退款xt_t {
class_ro_t_authed_ptr源码本钱<const class_ro_t> ro; //宫颈癌前期症状 class_r宫颈癌疫苗o_t
method_array_t methods; // 方源码编辑器编程猫下载法列表
p源码roperty_array_t properties; // 特征列表
protocol_array_t prGootocols; // 协议列表
// ...
};
// class_ro_t
struct class_ro_t {
// ...
void *baseMethodList;  // 办法列表
protocol_li龚俊st_tiOS * ba枸杞seProt宫颈癌疫苗ocols; // 协议列表
const ivar_list_t * ivars;  // 成员变量列表
property_list_t *baios14.4.2值得更新吗seProperties; // 特征列表
// ...
};

能够看到, 类政策的首要信息, 都存在了 cl源码编辑器ass_rw_ext_t 和 class_ro_t 两个结构体中

三、isa指针, su公积金perclass指针剖析

  • isa指针: object_getCgooglelass 函数回来的就是isa指针, 咱们能够经过这个函数来剖析

    Class object_getClass(id obj)
    {
    if (obj) return obj->getIsa();
    else retiOSurn Nilios模拟器;
    }
    
    • Person相关isa指针iOS

    iOS 底层原理02: 类,目标

    • NSObject相关isa指针

    iOS 底层原理02: 类,目标

依据咱们的实验, 能够总一下:源码之家

实例政策的isa -> 类政策, 类政策的isa -> 元类政策
元类政策的isa -> 根元类(NSOject) 根元类的isa -> 自身源码之家

  • su源码年代perclass指针

iOS 底层原理02: 类,目标

总结如下:

子类的supeios是什么意思rclass -> 父类政策
父类政策的superclass -> NSObject
NSObject的superclass -> nil

  • isa 和superclass 指针的总结图如下:

iOS 底层原理02: 类,目标

  • 办法调用次序

    依据isa指针的指向, 咱们就源码年代能够猜到, iOS 办法的调用源码年代次序如下:

    1. 实例办法:

    实例政策的isa指针指向类政策, 所ios14.4.1更新了什么以先在类政策的methods列表中找, 找不到则去类方狗狗币针的superclass中找, 究竟到找到NSObject

    1. 类办法:

    类政策的isios退款a指针指向元类政策, 所以先在元类政策的methods列表中找, 找不到则去元类政策的superclass中找,ios14.4.2值得更新吗 究竟找到NSObject