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

方法调配

类的方法列表会把选择子的名称映射到相关的方法实现上,使得“动态消息派发系统”能够据此找到应该调用的方法。这些方法实现均以函数指针来表示,这种指针叫做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的基础上打印出信息,相当于增加新的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值