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 - 9.基于Quartz2D绘制下载进度条(demo)
- oc 的一些概念
- [代码例程] iPhone开发入门(7)--- 从C/C++语言到Objective-C语
- oc 数值转换
- IOS 面试习题 Object-C
- objective-c block 讲解
- IOS求职之OC面试题
- iOS OC和Swift混编
- OC_继承,初始化
- 招一个靠谱的iOS程序员 - 轩哥整理
- OC 省市区划分
- iOS开发 — Quartz 2D知识点应用 (制作了一个Demo,源代码)
- OC 自定义 get/set 方法注意点
- OC 书签管理系统
- 编写 Objective-C 代码/掌握基本的编程技能 之 读后笔记
- OC Unicode和汉字(utf8)的互转
- 【整理】OC中常用的关于时间格式的转换
- iOStableView 自动布局常见问题之页面滑动到最底时,下面多出44的距离!
- Swift 和 OC 混编
- Objective-C ---点语法 (梳理整理)