Effective Objective-C 2.0 编撰高质量iOS与OS X代码 用“方法调配计数”调试“黑盒方法”
Effective Objective-C 2.0 编写高质量iOS与OS X代码 用“方法调配计数”调试“黑盒方法”
1. 在运行期间,可以向类中新增或替换选择子所对应的方法实现。
4. 类的方法列表会把选择子的名称映射到相关的方法实现之上,使得“动态消息派发系统”能够据此找到应该调用的方法。
摘取自:《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》,详细请购买书籍,支持作者及译者。
1. 在运行期间,可以向类中新增或替换选择子所对应的方法实现。
2. 使用另一份实现来替换原有的方法实现,这道工序叫“方法调配”(method swizzling),开发者常用调试技术向原有实现中添加新功能。
3. 一般来说,只有调试程序的时候才需要再运行期间修改方法实现,这种做法不宜滥用。
4. 类的方法列表会把选择子的名称映射到相关的方法实现之上,使得“动态消息派发系统”能够据此找到应该调用的方法。
这些方法均以函数指针的形式来表示,这种指针叫IMP,其原型如下:
id (*IMP)(id, SEL, …)
5. 互换两个方法的实现:
void method_exchangeImplementations(Method original,Method swapped)
其中方法实现的获取:
Method class_getInstanceMethod(Class a class, SEL aSelector);
有个有趣的例子:
- (NSString*)eoc_myLowercaseString { NSString *lowercase = [self eoc_myLowercaseString]; NSLog(@“%@“,lowercase); return lowercase; } Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString)); Method swappedMethod = class_getInstanceMethod([NSString class], @selector(roc_myLowercaseString)); method_exchangeImplementations(originalMethod, swappedMethod); NSString *string = @“ThIs iS tHe STRiNg”; NSString *lowercaseString = [string lowercaseString]; // Output: this is the string
摘取自:《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》,详细请购买书籍,支持作者及译者。