在上一篇的demo中,增加几个类方法:
1 | // ObjectA.h |
用代码输出方法信息:
1 | // 定义 ISA_MASK 用于获取isa指针 |
不难发现,刚刚新增的两个类方法并没有被输出。
原因是因为类方法和实例方法并不是存放在一起;在OC的设计中,有类的类的说法,即我们日常开发中的元类。而我们定义的类方法,就存储在元类中。
回顾一下类的定义:
1 | struct objc_class : objc_object { |
之前我们把重心放在了bits上,现在我们回过头分析一下它的整个结构,就会发现,它也有一个isa指针(继承自objc_object)。元类就存储在类对象的isa中。元类也是objc_class类型。
元类也是objc_class结构体,那我们一样可以用上面的代码去解析它的方法列表(元类中只存储类方法):
1 | ObjectA *aObj = [[ObjectA alloc] init]; |