对象
我们知道对象
是某个类
的实例,并且这个对象的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的类都继承了这个成员变量。
元类(metaclass)
我们上面提到,Objective-C中的类也是对象,它是元类
的实例。
上面说到,我们调用实例方法,对象会根据isa找到类,看类能不能响应。
如果调用类方法
,同样类对象也会根据isa找到元类
,看元类能不能响应这个类方法。
实例方法保存在类中,类方法保存在元类中
那么问题又来了,元类是对象吗?如果是,它是什么类的实例?
元类也是对象,是某个类的实例,元类是根元类(root metaclass)
的实例。
<a name="fenced-code-block">所有元类所属的类都是同一个根元类</a>,根元类也是元类,它所属的类也是根元类,就是它本身。根元类就是根类的元类,就是根类NSObject对应的元类
。
看一张图: