您的位置:首页 > 移动开发 > Objective-C

Effective Objective-C 2.0 第13条:用“方法调配技术”调试“黑盒方法”

2016-06-23 14:55 489 查看

方法调配

类的方法列表会把选择子的名称映射到相关的方法实现上,使得“动态消息派发系统”能够据此找到应该调用的方法。这些方法实现均以函数指针来表示,这种指针叫做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的基础上打印出信息,相当于增加新的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oc