对于这几个方法的区别,首先需要理解 OC 类的数据结构,(任何runtime的文章都会详情的)
对于 class
和 object_getClass
和 objc_getClass
三种方法,首先:一律返回 Class 类对象
class
方法class
方法无论是类对象还是实例对象都可以调用,可以嵌套,返回永远是自身的类对象。如:Person *p = [[Person alloc]init];Class *pClass == [p class] == [ [p class]class] == [[ [p class]class]class] == [Person class]
object_getClass
和 class
同样可以嵌套,但是 object_getClass
得到的是他的 isa 指向的地址。即:Person *p = [[Person alloc]init]; p->[Person class]->PersonMeteClass->PersonMetaClass(元类的ISA指针是指向自己的)
意思是 p 的 isa 指向 [Person class] , [Person class] 的 isa 指向 PersonMeteClass
勘误:PersonMeteClass应该指向基类的meteClass,基类meteClass指向他自己
objc_getClass
方法objc_getClass
无法嵌套,由于参数 是 char
类型,效果和 class
相同(由于不能嵌套,所以和class
可以认为是相同的)验证:通过
class_isMetaClass
方法可以验证(方法判断能否是元类)