有下面这种情况
@interface NSObject (Test)
+ (void)test;
@end
#import "NSObject+Test.h"
@implementation NSObject (Test)
- (void)test
{
NSLog(@"-[NSObject test] - %p", self);
}
@end
如果我执行
[NSObject test];
会发生什么情况呢?
看下面这张图,我觉得可以很好地解释。

因为oc方法执行的本质是发送消息也就是obj_msgSend.
那么NSObject要执行test类方法,那么肯定要顺着指针去元类里面去找,但是元类里面没有这个类方法,然后找元类的superClass,元类的superClass也是NSObject,那么里面正好有个test的对象方法,然后就可以执行了。
可以执行的原因呢?为什么明明执行的是类方法,最后却执行了对象方法呢?
那是因为 objc_msgSend([NSObjct class], @selector(test)) 发送消息,并没有说是触发的类方法还是对象方法。所以找到哪个执行哪个,NSObjct中没有类方法+Test,但是有对象方法-test,所以执行test方法。
那如果变为下面这种情况呢?会执行哪个呢?
@implementation NSObject (Test)
+ (void)test
{
NSLog(@"-[NSObject test] - %p", self);
}
- (void)test
{
NSLog(@"-[NSObject test] - %p", self);
}
@end
我们可以继续分析,因为执行的是类方法,所以去元类中取找,正好元类中有这个test的类方法,所以就执行了+Test方法。
网友评论