类的结构
2020-03-17 本文已影响0人
算命的李老师
(Class superClass.png
==
==objc_class==
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE; // 父类
const char *name OBJC2_UNAVAILABLE; // 类名
long version OBJC2_UNAVAILABLE; // 类的版本信息,默认为0
long info OBJC2_UNAVAILABLE; // 类信息,供运行期使用的一些位标识
long instance_size OBJC2_UNAVAILABLE; // 该类的实例变量大小
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 该类的成员变量链表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 方法定义的链表
struct objc_cache *cache OBJC2_UNAVAILABLE; // 方法缓存
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 协议链表
#endif
} OBJC2_UNAVAILABLE;
==isa
指针==
我们创建的一个对象或实例其实就是一个 struct objc_object
结构体,而我们常用的id
也就是这个结构体的指针。
这个结构体只有一个成员变量,这是一个Class类型的变量isa,也是一个结构体指针。
对象的isa指针就指向对象所属的类。
==元类==
元类的定义:元类是类对象的类。
struct objc_classs
结构体里存放的数据称为元数据(metadata),里面存放有指向父类的指针、类的名字、版本、实例大小、实例变量列表、方法列表、缓存、遵守的协议列表等
==类对象==
Class
本身其实也是一个对象,我们称之为类对象。
类对象在编译期产生用于创建实例对象,是单例
NSString *str = @"Hello World";
str对象本质就是一个
objc_object
结构体,而这个结构体的成员变量isa指针则表明了str is a NSString,因此这个isa就指向了NSString类,这个NSString类其实是类对象。
类对象的isa指针指向的我们称之为元类(metaclass
)
==类簇==
类簇实际上是Foundation framework框架下的一种设计模式,它管理了一组隐藏在公共接口下的私有类。
如图 NSNumber就是个类簇
[图片上传失败...(image-9851e1-1584429110930)]
==分类==
- 分类是不能添加属性的,只能关联属性。
- 是在在类中用二维数组维护。
- 当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次
- 在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的
分类为什么用二维数组存储
==关联对象==
关联对象由AssociationsManager 管理并在AssociationsHashMap存储。这是一个全局的容器。
==isa指向==
- 实例对象isa指针指向类对象
- 类对象的isa指针指向了元类
- 元类isa指向根元类
- 根元类isa指向自己
==super_class指向==
- super_class指针指向了父类的类对象
- 元类的super_class指针指向了父类的元类