美文网首页
12.8 元类meta-class

12.8 元类meta-class

作者: 哈库呐玛塔塔__ | 来源:发表于2020-05-15 00:33 被阅读0次

    对于oc对象模型,我们清楚在运行时一个类的对象可以通过它自身的isa指针找到它所归属的类,比如一个NSString类的实例对象aaa,调用它的一个实例方法 [aaa substringFromIndex:1], 实际就是向对象aaa发送了一个消息,运行时库会根据aaa的isa指针找到这个对象所归属的类,这个类包含一个所有实例方法的以及一个指向superclass的指针以便可以找到父类的实例方法, 运行时库会在类的方法列表以及父类(们)的方法列表中寻找符合这个selector( 这里这个selector是”substringFromIndex:1")的方法。找到后即运行这个方法。关键点就是类要定义这个你发送给对象的消息)。

    那么什么是 meta-class

    一个oc类其实也是一个对象,意思就是你向一个类发送消息,也就是调用一个类方法比如 [NSString alloc], 因为每一个OC的类本身也是一个对象。也就是说Class的数据结构必然也是以isa指针开始的, 在二进制级别上与objc_object是完全兼容的。然后一个类结构的下一个字段一定是一个指向super class的指针(或者指向nil,对于基类而言)。

    一个类如何定义有很多方法,依赖于你的运行时库版本,但是不管哪种方法,他们都是以一个isa作为第一个字段,接着是superclass字段。

    为了可以调用类方法,这个类的isa指针必须指向一个包含这些类方法的类结构体。

    这样就引出了meta-class的概念:meta-class是一个类对象的类。

    简单解释下:

       当你向一个对象发送消息时,runtime会在这个对象所属的那个类的方法列表中查找。
    
       当你向一个类发送消息时,runtime会在这个类的meta-class的方法列表中查找。
    

    meta-class之所以重要,是因为它存储着一个类的所有类方法。每个类都会有一个单独的meta-class,因为每个类的类方法基本不可能完全相同。

    meta-class的类又是什么呢?

    meta-class,就像Class一样,也是一个对象。你依旧可以向它发送消息调用函数,自然的,meta-class也会有一个isa指针指向其所属类。所有的meta-class使用基类的meta-class作为他们的所属类。具体而言,任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己所属的类。

    根据这个规则,所有的meta-class使用基类的meta-class作为它们的类,而基类的meta-class也是属于它自己,也就是说基类的meta-class的isa指针指向它自己。(译:完美的闭环)

    类和meta-class的继承

    就像一个类使用super_class指针指向自己的父类一样,meta-class的super_class会指向类的super_class的meta-class。一直追溯到基类的meta-class,它的super_class会指向基类自身。

    isa 和继承的关系 image.png

    结论:

    meta-class是类对象的类,每个类都有自己单独的meta-class。所有的类对象并不会属于同一个meta-class。
    meta-class要保证类对象具有继承体系中基类的所有实例和类方法,以及继承体系中的所有中间类方法。对于所有NSObject继承体系下的类,NSObject的实例方法和协议方法对他们和他们meta-class的对象都要有效。
    所有的meta-class使用基类(NSObject)的meta-class作为自己的基类,对于顶层基类的meta-class也是一样,只是它指向自己而已。

    相关文章

      网友评论

          本文标题:12.8 元类meta-class

          本文链接:https://www.haomeiwen.com/subject/catgnhtx.html