您当前的位置: 首页 > 

white camel

暂无认证

  • 1浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Runtime 一一 runtime作用-交换方法

white camel 发布时间:2018-01-26 12:25:31 ,浏览量:1

Runtime(交换方法)应用场景: 系统自带的方法功能不够,给系统自带的方法扩展一些功能,并保持原有的功能.

假如有一个需求: 有一个项目,已经开发2年,突然项目经理要求添加一个功能,每次加载UIImage图片,返回是否加载成功.

解决方法1: 自定义UIImage,重写imageNamed方法.

弊端: 1. 每次使用,都需要导入自定义的类 2. 项目大了实现困难

#import "ZYImage.h"

@implementation ZYImage

+ (UIImage *)imageNamed:(NSString *)name
{
    UIImage *image = [super imageNamed:name];
    
    if (image == nil) {
        NSLog(@"图片不存在");
    }else{
        NSLog(@"图片存在");
    }
    
    return image;
}

@end
解决方法2: 添加分类,使用runtime方式,交换方法
Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
    //2. 获取ZY_imageNamed:方法
    Method zy_imageNamed = class_getClassMethod(self, @selector(ZY_imageNamed:));
    // 交互方法 runtime
    method_exchangeImplementations(imageNamedMethod, zy_imageNamed);
#import "UIImage+image.h"
#import 

@implementation UIImage (image)

// 注意: 在分类中重写系统的方法,会将系统的方法给覆盖掉.
//+ (UIImage *)imageNamed:(NSString *)name
//{
    [super imageN] 此时super--->NSObject 因此不可以调用父类的方法
//    return nil;
//}

// 把类加载进内存的时候调用,只会调用一次(只需要交换一次)
+ (void)load
{
    //1. 获取imageNamed:方法
    /*
     param1: 获取哪个类的方法
     param2: 获取哪个方法. 类方法:getClassMethod 对象方法:getInterfaceMethod
     */
    Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
    //2. 获取ZY_imageNamed:方法
    Method zy_imageNamed = class_getClassMethod(self, @selector(ZY_imageNamed:));
    // 交互方法 runtime
    method_exchangeImplementations(imageNamedMethod, zy_imageNamed);
    // 调用imageNamed => zy_imageNamedMethod
    // 调用zy_imageNamedMethod => imageNamed
}

// 会调用多次,swift中没有load方法,只能使用initialize方法
//+ (void)initialize
//{
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//
//    });
//}

 + (UIImage *)ZY_imageNamed:(NSString *)name
{
    // 死循环
//    UIImage *image = [UIImage imageNamed:name];
    UIImage *image = [UIImage ZY_imageNamed:name];
    
    if (image) {
        NSLog(@"加载成功");
    }else{
        NSLog(@"加载失败");
    }
    
    return image;
}

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    
//    UIImage *image = [ZYImage imageNamed:@"1.png"];
    
    UIImage *image = [UIImage imageNamed:@"1.png"];
    
}

关注
打赏
1661428283
查看更多评论
立即登录/注册

微信扫码登录

0.0384s