iOS之《Effective Objective-C 2.0》读书笔记(13)

第13条:用“方法调配技术”调试“黑盒方法”

1.方法调配的概念

(1)在运行期,可以向类中新增或替换选择子所对应的方法实现
(2)使用另一份实现替换原来方法的实现,这叫“方法调配”,此技术可向原有实现中添加新功能
(3)不宜滥用

2.具体使用
  • 在+load中执行

  • 在dispatch_once中执行

  • method_exchangeImplementations(A,B) :交换方法AB

  • class_replaceMethod :修改类

  • class_getInstanceMethod(Class aClass, SEL aSelector) :从类中取出与之相关的方法

3.应用1-交换方法
// 交换方法
Method originalMethod = class_getInstanceMethod([NSStringclass],                         @selector(lowercaseString));  
Method swappedMethod =  
    class_getInstanceMethod([NSStringclass],  
                            @selector(uppercaseString));  
method_exchangeImplementations(originalMethod, swappedMethod); 

// 使用
NSString *string = @"ThIs iS tHe StRiNg";  

NSString *lowercaseString = [string lowercaseString];  
NSLog(@"lowercaseString = %@", lowercaseString);  
// Output: lowercaseString = THIS IS THE STRING  

NSString *uppercaseString = [string uppercaseString];  
NSLog(@"uppercaseString = %@", uppercaseString);  
// Output: uppercaseString = this is the string 
4.应用2-添加新功能
  • 新方法可以添加至NSString的一个“分类”(category)中:
@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); 
  • 调用lowercaseString方法,并输出
NSString *string = @"ThIs iS tHe StRiNg";  
NSString *lowercaseString = [string lowercaseString];  
// Output: ThIs iS tHe StRiNg => this is the string 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值