1.iOS runtime之MetaClass

泛形

我们知道在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的元类就是根元类,根元类的元类就是它自己。

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

结语

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

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

推荐阅读更多精彩内容