这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战缓存
将实例对象isa
进行&
运算,可获得类对象的地址。一样在OC中,类也是一个对象。既然是对象,也会存在isa
指针,指向他所属的类。这就是咱们所说的元类(MetalClass
)。markdown
MetalClass
)isa
为nonpoionter
类型,除了类对象地址,isa中包含类信息,因此&运算后地址不一样isa
为非nonpointer
类型,属于纯isa指针,只存储类对象的地址,全部&运算后地址相同NSObject
做为根类,它的isa
指向的元类,称为根元类。XXClass
元类isa
指向的地址相同。XXClass
的元类isa,指向的并非NSObject
,而是根元类(NSObject的元类
)。isa
指向本身。继承链流程图数据结构
NSObject
做为根类,它才是真正的万物之主,全部类都源于NSObject
类也是一个对象,有本身的数据结构,而类的底层来自objc_class
结构体,可经过源码分析类的结构,在objc-runtime-new.h
中,能够看到objc_class结构体的定义:源码分析
struct objc_class : objc_object {
objc_class(const objc_class&) = delete;
objc_class(objc_class&&) = delete;
void operator=(const objc_class&) = delete;
void operator=(objc_class&&) = delete;
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
...
};
复制代码
从上面的源码定义来看,咱们的类也是一个对象,只是里面比对象多了几个成员变量superclass、cache、bits。post