objc_class 简介

来源:互联网 发布:ubuntu 界面小应用 编辑:程序博客网 时间:2024/06/06 07:10

首先先来看一下OC中 Class 具体的结构:

typedef struct objc_class *Class;
struct objc_class {        Class isa;    #if !__OBJC2__        Class super_class                                        OBJC2_UNAVAILABLE;        const char *name                                         OBJC2_UNAVAILABLE;        long version                                             OBJC2_UNAVAILABLE;        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;

以上可知,Class 本质上是指向objc_class结构体的一个指针,现在我们具体介绍一下结构体中每一个成员所代表的意义。

  • isa 表示指向Class类型的指针,实例对象中的isa指向对应的Class类,Class类中的isa指向metaClass
  • super_class 指向当前类的父类,如果已经是最顶层的类(NSObject 、NSProxy)super_class为NULL
  • name 表示当前类的名字
  • version 版本信息
  • info 供运行期使用的一些标识信息
  • instance_size 实例对象大小
  • ivars 所有成员变量数组
  • methodList 定义的方法数组
  • cache 最近调用方法名称和内存地址相对应的hash缓存表
  • 协议数组

我们都知道用id 可以表明指向任何类型的实例对象,本质上id是指向objc_object结构体的指针:

typedef struct objc_object *id;
struct objc_object { Class isa; };

以上可知,我们构造的对象本质就是一个结构体,里面又一个isa指针指向当前对象的类型也就是objc_class

需要注意的是上面的方法列表等都是对应当前类构成的实例变量声明的实例方法,类方法的列表需要根据isa 找到metaClass中的方法列表。

Runtime

上文中objc_class结构体中成员都可以在运行时进行访问。通过isa指针,runtime可以确定具体所要操作的类型,然后runtime提供了一系列的API用来访问其他成员属性。

每个API都有一个前缀来表明操作的对象,针对于实例对象的方法以objc_ 为前缀,针对于类的方法以class_ 为前缀。

原创粉丝点击