浮于表面探究问题不失为一种方法,但是弄清楚本质才是真正意义上的解决疑惑。
之前已经写过一篇博客- (IMP)methodForSelector与+ (IMP)instanceMethodForSelector的区别,通过测试代码探索二者区别。本文将通过源代码来剖析二者的区别。
methodForSelector分两种情况,类函数和实例函数,代码实现如下:
//类函数,通过遍历类对象的函数列表,返回对应的结果
+ (IMP)methodForSelector:(SEL)sel {
if (!sel) [self doesNotRecognizeSelector:sel];
return class_getMethodImplementation(object_getClass((id)self), sel);
}
//实例函数,通过遍历实例对象的函数列表,返回对应的结果
- (IMP)methodForSelector:(SEL)sel {
if (!sel) [self doesNotRecognizeSelector:sel];
return class_getMethodImplementation([self class], sel);
}
通过代码可以看出,methodForSelector函数实现是通过遍历对象(实例对象和类对象)函数列表,返回对应的结果。
instanceMethodForSelector函数代码实现如下:
//通过遍历实例对象的函数列表,返回对应的结果
+ (IMP)instanceMethodForSelector:(SEL)sel {
if (!sel) [self doesNotRecognizeSelector:sel];
return class_getMethodImplementation(self, sel);
}
通过代码可以看出,instanceMethodForSelector类函数是通过遍历自身中的函数列表,返回对应的结果。换句话说,如果调用的一个元类,那么返回的是一个类实例的函数,如果调用的是一个类,那么返回的就是实例对象的函数。
看了源代码才觉得这样的问题其实没有太多研究的必要,源代码已经一目了然了。