类的结构

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)]

==分类==

分类为什么用二维数组存储

==关联对象==

关联对象由AssociationsManager 管理并在AssociationsHashMap存储。这是一个全局的容器。

==isa指向==
==super_class指向==
上一篇下一篇

猜你喜欢

热点阅读