runtime交换方法

2018-07-20  本文已影响11人  StoneWing

+ (UIImage *)wsl_imageNamed:(NSString *)imageName {
    UIImage *image = [UIImage imageNamed:imageName];
    if (imageName == nil) {
        NSLog(@"图片为空");
    }
    return image;
}

注:这么做的弊端


+ (UIImage *)wsl_imageNamed:(NSString *)imageName {
    UIImage *image = [UIImage imageNamed:imageName];
    if (imageName == nil) {
        NSLog(@"图片为空");
    }
    return image;
}
+ (void)load {
    // 获取系统的imageNamed方法
    Method imageNamedMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
    // 获取自定义的方法
    Method wsl_imageNamedMethod = class_getClassMethod([UIImage class], @selector(wsl_imageNamed:));
    // 交换
    method_exchangeImplementations(imageNamedMethod,wsl_imageNamedMethod);
}

注意: 因为我们把系统的方法和自定义的方法进行了交换,所以我们自定义的方法需要进行写修改

+ (UIImage *)wsl_imageNamed:(NSString *)imageName {
    // 因为方法已经交换,所以调用的imageNamed方法其实是调用的wsl_imageNamed,会进入死循环
//    UIImage *image = [UIImage imageNamed:imageName];
    // 修改为 wsl_imageNamed
    UIImage *image = [self wsl_imageNamed:imageName];
    if (imageName == nil) {
        NSLog(@"图片为空");
    }
    return image;
}
上一篇下一篇

猜你喜欢

热点阅读