实用工具iOS分享之路-快速开发电商平台程序员

【iOS分享之路-快速上手Runtime】二、方法交换

2017-03-18  本文已影响3208人  全栈攻城狮DWQ
DWQ-LOGO.jpeg

引述

在通常开发过程中,我们经常会用到系统类,而它提供的方法又不能完全满足我们开发的需要,那么在此时,我们需要为系统自带的方法扩展一些功能,而且还要保证原有的功能可正常使用.假设咱们现在有这么一个需求,我们在调用系统的[UIImage imageNamed:@"runtime"];的时候,我们并不能判断有没有加载成功,所以我们想在加载图片的时候并判断是否加载成功。

解决方案

//.h文件中声明
+(UIImage *)dwq_imageNamed:(NSString *)imageName;
//.m文件中实现
+(UIImage *)dwq_imageNamed:(NSString *)imageName{

   //首先加载图片
    UIImage *image=[UIImage imageNamed:imageName];
    
   //然后实现功能【判断是否为空】
  
    if (image==nil) {
        NSLog(@"图片为空");
    }
    return image;
}


步骤2.在需要使用的地方,引入分类头文件,然后调用类方法

#import "UIImage+DWQcategory.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *image=[UIImage dwq_imageNamed:@"runtime"];
}

这样,我们就可以实现我们的功能需求,但是,我们最初的想法是想还是通过调用系统的方法来实现加载图片并判断是否加载成功,而且这里使用的话还要引入分类头文件。那么,接下里我们用第二种方法实现,利用Runtime交换方法来实现

//获取类方法:class_getClassMethod
   //获取实力方法:class_getInstanceMethod
    //IMP:方法的实现
    //1.首先获取方法
    /*参数说明*/
    // Class :哪个类的方法
    // SEL :获取方法编号
    Method imageNameMethod=   class_getInstanceMethod([UIImage class], @selector(imageNamed:));
    Method dwq_imageNameMethod=   class_getClassMethod([UIImage class], @selector(dwq_imageNamed:));

步骤3.交换方法

 //方法的交换
    method_exchangeImplementations(imageNameMethod, dwq_imageNameMethod);

步骤4.如果此时你认为完事了,调用系统的imageNamed方法,会造成死循环。因为我们在自定义的方法中加载图片调用的就是系统的imageNamed的方法,此时应该修改代码如下:

防止死循环.png

Runtime交换方法效果

交换方法.png

Runtime交换方法Demo

Runtime交换方法Demo
广大书友记得给个赞,在GitHub上给个Star噢!

上一篇 下一篇

猜你喜欢

热点阅读