iOS之《Effective Objective-C 2.0》读书笔记(13)
来源:互联网 发布:goto是java关键字吗 编辑:程序博客网 时间:2024/06/04 17:47
第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
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- iOS之《Effective Objective-C 2.0》读书笔记(21)
- 阿里云网站上线全套流程
- Spark[二]:org.apache.spark.SparkException: Task not serializable
- C51单片机定时器
- HTTP响应头和请求头信息对照表
- 《将博客搬至CSDN》
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- JDK tools
- Android 常用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir
- 第二章 2.4优先队列
- strspn源码
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
- 算法 递归和循环的转换
- 在Postman中使用不受信任的SS
- jQuery has deprecated synchronous XMLHTTPRequest