泛形
我们知道在C/C++中void可以用来表示任何类型的对象,而在iOS中同样有个泛形的关键字id。二者有着相似的功能,但从本质上来说,他们确有着巨大的区别。void的背后是C/C++的那套指针体系,而id的背后则是整个OC的runtime机制。
类与对象
OC类Class的定义代码如下:
typedef struct objc_class *Class;
struct objc_class {
Class isa;
Class super_class;
struct objc_method_list **methodLists
/* followed by runtime specific details... */
};
super_class指的就是该类的基类,methodLists则是类的方法列表,包含了该类中的所有实例方法,而isa就是我们常说的元类了。那么这个元类是干什么用的呢,isa中的methodLists中包含了类的所有静态方法。
OC中对象也是有定义的,定义代码如下:
typedef struct objc_object *id;
struct objc_object {
Class isa;
};
注意这里也同样有一个isa,它指向的正是类结构的具体定义。根据这个isa中,一个对象便可以调用到一个类中所有的方法:
- 当调用类的实例方法时,会在类的方法列表methodLists中查找该方法
- 当调用类方法时,会在元类的方法列表methodLists中查找该方法。
类继承体系
说了这么久,MetaClass的类是什么呢?所有的元类都使用根元类作为它的类,也就是说所有继承自NSObject的类的元类都会以NSObject的元类作为类。NSObject的元类就是根元类,根元类的元类就是它自己。
结语
元类只是iOS类继承体系中的一环,只是一个普通的NSObject类。后续也会对runtime的其它功能作出相应的分析。