方法调配
类的方法列表会把选择子的名称映射到相关的方法实现上,使得“动态消息派发系统”能够据此找到应该调用的方法。这些方法实现均以函数指针来表示,这种指针叫做IMP,原型如下:
id (*IMP)(id, SEL, ...) //SEL 表示方法名
例如:NSString类可以响应;lowercaseString、uppercaseString、capitalizedString等选择子,每个不同的选择子都映射到了不同的IMP上:
OC通过运行期系统提供的方法可以交换两个选择子映射的指针。
互换两个已写好的方法实现方法,调用函数:
void method_exchangeImplementations(Method m1, Method m2)
Method 通过运行时方法获得:
Method class_getInstanceMethod(Class aClass, SEL aSelector)
例:可以通过这种技术为现有方法增加新功能
@interface NSString (EOCMyAdditions)
- (NSString*)eoc_myLowercaseString;
@end
@implementation NSString (EOCMyAdditions)
- (NSString*)eoc_myLowercaseString {
NSString* lowercase = [self eoc_myLowercaseString];
NSLog(@"%@ => %@", self, lowercase);
return lowercase;
}
@end
Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));
Method swappedMethod = class_getInstanceMethod([NSString class], @selector(eoc_myLowercaseString));
method_exchangeImplementations(originalMethod, swappedMethod);
NSString* string = @"This is the StRiNg";
NSString* lowercaseString = [string lowercaseString];
eoc_myLowercaseString方法执行时不会死循环,会在lowercaseString的基础上打印出信息,相当于增加新的功能。