当前位置: 首页 > 科技观察

Runtime系列(类和元类)

时间:2023-03-14 18:56:15 科技观察

如果你看过Runtime系列(引用),你可能会发现里面有一个词:类对象。那么什么是类对象呢?先看一段代码NSArray*arr=[NSArrayarray];它是如何工作的?上一篇文章提到,[receivermessage]底层会调用idobjc_msgSend(idself,SELop,...)。我们再回顾一下什么id是structobjc_object{ClassisaOBJC_ISA_AVAILABILITY;};typedefstructobjc_object*id;id指向一个对象,可以猜到[NSArray数组]中的NSArray也是一个对象。但是NSArray怎么可能是一个对象呢?这就引出了本文的另一个主角元类。其实像NSArray、arr这样的元类也是对象,称为类对象。从Class.png可以看出,Class还有一个isa指针,指向自己的元类。元类是类对象的类,类对象是元类的实例。基于这种设计模式,不难发现:1、我们以前调用“+”开头的类方法,其实是调用元类的对象方法2、由于每个类只有一个,所以每个类对象本身就是一个单例对应一个元类那么,元类是对象吗?答案是肯定的,元类是对象。如果元类也是对象,那么元类的类是什么?元类的类看一下网上的示意图.pngDiagram目前我接触到的oc对象都是继承自NSObject。不知道还有没有其他的Root类。这里我们以NSObject为例。1.每个实例对象的类是一个类对象,每个类对象的类是一个元类对象,每个元类对象的类是一个根元类(根元类的isa指向自己)2.classobject父类最终继承自根类对象NSObject,NSObject的父类为nil3。元类对象(包括根元类)的父类最终继承自根类对象NSObject。可见,类和元类是一个闭环。