1.iOS runtime之MetaClass

2016-10-30  本文已影响51人  秦砖

泛形

我们知道在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中,一个对象便可以调用到一个类中所有的方法:

类继承体系

说了这么久,MetaClass的类是什么呢?所有的元类都使用根元类作为它的类,也就是说所有继承自NSObject的类的元类都会以NSObject的元类作为类。NSObject的元类就是根元类,根元类的元类就是它自己。

类用super_class指向自己的基类,同样,元类也用自己的super_class指向类的super_class的元类。而根元类的super_class则指向了NSObject,这样类的isa与super_class实质上都是NSObject类的子类,而NSObject也因此成为了iOS类继承体系中最根本的类。有一张图能够更清晰的展示这些关系: iOS类继承体系

结语

元类只是iOS类继承体系中的一环,只是一个普通的NSObject类。后续也会对runtime的其它功能作出相应的分析。

上一篇 下一篇

猜你喜欢

热点阅读