欢迎光临
梦想从学习开始!

用方法调配技术调试黑盒方法| 小熊测试

本文主要介绍 用方法调配技术调试黑盒方法| 小熊测试,小熊希望对大家的学习或者工作具有一定的参考学习价值,在测试领域有所提升和发展。

  Object-C是允许进行方法调配的,什么叫方法调配呢?解释一下。

  以NSString类为例,其中有lowercaseString和uppercaseString方法,获取两个方法的实例:

  Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));

  Method swappedMethod = class_getInstanceMethod([NSString class], @selector(uppercaseString));

  方法交换:

  method_exchangeImplementations(originalMethod, swappedMethod);

  从现在开始,如果在NSString实例上调用lowercaseString,那么执行的将是uppercaseString方法,反之亦然。

  类的方法列表会把选择子的名称映射到相关的方法实现之上,使得“动态消息派发系统”能够据此找到应该调用的方法。这些方法均以函数指针的形式来表示,这种指针叫做IMP,其原型如下:

  id (*IMP) (id, SEL, …)

  上述方法其实是交换了IMP指针。

  但是在实际使用的过程中,交换两个方法的意义并不大,我们可以把这种技术应用在哪里呢?

  我们可以在类别中写一个方法:

@implementation NSString (MyAdditions)

– (NSString *)myLowercaseString

{

NSString *lowercase = [self myLowercaseString];

NSLog(@"%@ => %@", self, lowercase);

return lowercase;

}

@end

  看上去此方法会死循环,不过此方法是准备和lowercaseString方法互换的:

  Method originalMethod = class_getInstanceMethod([NSString class], @selector(lowercaseString));

  Method swappedMethod = class_getInstanceMethod([NSString class], @selector(myLowercaseString));

  method_exchangeImplementations(originalMethod, swappedMethod);

  通过此方案,开发者可以为那些“完全不知道其具体实现”的黑盒方法增加日志记录功能,这非常有助于程序调试。然而只在调试时使用,很少有人采用此方法来永久改动某个类的功能。若是滥用,反而会令代码变得不易懂且难维护。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小熊分享邦(www.xxfxb.com),希望大家能坚持软件测试之路,谢谢。

赞(0) 打赏
未经允许不得转载:小熊分享邦 » 用方法调配技术调试黑盒方法| 小熊测试

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏