元类和类的数据结构是同一个,只是运行时使用的字段不一样。
实例方法调用是通过objc_msgSend来调用,它的第一个入参就是实例对象,其流程是查找实例对象的isa指针,找到类对象,然后找到method_t的IMP,bl直接跳转调用。
类方法的调用和实例方法调用一致,它的第一个入参对象是类对象,类对象的isa指向的是元类。
所以,没有元类的话,类方法是没有办法调用的。objc_msgSend的调用流程是一定要isa指针的。
如果实例方法和类方法都放在类对象上,那类对象的isa指针只能指向自己了,那一旦类方法和实例方法重名,就没法搞了!
网友评论