runtime--实现篇01(Method Swizzling)

 

iOS中的Swizzle效果:拦截系统方法

   

@implementation UIImage (Extension)


 /**

 * 当某个类或者分类加载进内存时,会调用1次

 */

+ (void)load {  

    // 获取系统的方法

   Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));


    // 获取自定义的方法

    Method m2 = class_getClassMethod([UIImage class], @selector(test_imageNamed:));


    // 交换两个方法的实现

    method_exchangeImplementations(m1, m2);


}


/**

 * 用于交换系统的方法

 */


+ (UIImage *)test_imageNamed:(NSString *)name {


     double version = [[UIDevice currentDevice].systemVersion doubleValue];


    // iso7统的全部匹配_os7后缀的图片

    if (version >= 7.0) {  


        // 拼接图片名称

        name = [name stringByAppendingString:@"_os7"];

 

    }


    NSLog(@"%s---name:%@",__func__,name);


    return [UIImage test_imageNamed:name];


}


在控制器中测试-------------------------------------


- (void)viewDidLoad {


    [super viewDidLoad];


     self.imageView.image = [UIImage imageNamed:@"close"];

     self.imageView2.image = [UIImage imageNamed:@"fire"]; 


 }


 

分析:首先调用imageNamed:方法自动交换为调用test_imageNamed:方法,故日志打印如下,通过return [UIImage test_imageNamed:name],交换后调用


imageNamed:方法,


2015-07-09 00:11:38.174 04-运行时的应用-交换系统方法[37034:421104] +[UIImage(Extension) test_imageNamed:]---name:close_os7

2015-07-09 00:11:38.180 04-运行时的应用-交换系统方法[37034:421104] +[UIImage(Extension) test_imageNamed:]---name:fire_os7



posted @ 2015-06-10 16:37  guozhong  阅读(129)  评论(0)    收藏  举报