前言
在上一篇文章中我们在进行lldb调试的时候,发现实例方法在当前类中,但是类方法不在当前类中,那么这个类方法究竟在哪里呢?
探索
1.lldb指令验证
获取到LGPerson这个类的isa

然后通过这个isa获取当前类的元类,然后去元类中查找方法



我们类方法say666在我们的元类中。
2.代码认证
LGPerson *person = [LGPerson alloc];
Class pClass = object_getClass(person);
const char *className = class_getName(pClass);
Class metaClass = objc_getMetaClass(className);
Method method1 = class_getClassMethod(pClass,@selector(say666));
Method method2 =class_getClassMethod(metaClass,@selector(say666));
我们发现method1和method2都可以打印出来这个类方法,但是lldb验证的时候确是没有的,我们打开objc源码,查询class_getClassMethod这个方法如下:


我们getMeta这个方法会判断当前类是否是元类,如果是元类直接返回这个方法,如果不是继续查找它的元类,然后返回这个方法,所以类方法是存在元类中的
网友评论