Runtime之对象,类

对象

我们知道对象是某个的实例,并且这个对象的isa指针指向它所属的类。来看一下它的定义,实际上是一个objc_object类型的结构体。这个结构体指针可以使用id来代替,所以id可以指向任何对象。

typedef struct objc_object *id;
对象的定义

先来看一下runtime中的定义:

typedef struct objc_class *Class;

类的定义

可以看到,类中定义了成员变量old_ivar_list,方法列表old_method_list,遵守的协议old_protocol_list
当我们调用[receiver message]来给一个对象发送消息时,这个对象会跟isa找到对象所属的类,看类中能不能响应这个消息,如果不能响应,会继续根据superclass去寻找父类。
Objective-C中的类本质上也是对象,称为类对象对象都是某个类的实例,那么类对象又是什么类的对象呢?元类
Objective-C中又个非常特殊的类,NSObject,类都继承于这个类,这个类只有一个成员变量isa指针,继承于NSObject的类都继承了这个成员变量。

NSObject类定义

元类(metaclass)

我们上面提到,Objective-C中的类也是对象,它是元类的实例。
上面说到,我们调用实例方法,对象会根据isa找到类,看类能不能响应。
如果调用类方法,同样类对象也会根据isa找到元类,看元类能不能响应这个类方法。

实例方法保存在类中,类方法保存在元类中

那么问题又来了,元类是对象吗?如果是,它是什么类的实例?
元类也是对象,是某个类的实例,元类是根元类(root metaclass)的实例。
<a name="fenced-code-block">所有元类所属的类都是同一个根元类</a>,根元类也是元类,它所属的类也是根元类,就是它本身。根元类就是根类的元类,就是根类NSObject对应的元类
看一张图:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容