JoshPell

人生只有必然,没有偶然

欢迎来到我的个人网站~


RunTime方法交换

项目中使用下面这个方法很常见:

[UIImage imageNamed:@"img1"];

这个方法在图片不存在是会引起崩溃,这里先提供两种简单点的方法。

继承

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

    // 恢复系统做法
    UIImage *image = [super imageNamed:name];
    if ( image == nil ) {
        NSLog(@"加载失败");
        return [UIImage imageNamed:@"default"];
    }
    return image;
}

就是创建一个UIImage的子类,用子类的imageNamed:方法加载图片

分类

分类方法挺好,简洁。切记,方法名不能重复系统方法名,可以加个前缀

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

    // 恢复系统做法
    UIImage *image = [UIImage imageNamed:name];
    if ( image == nil ) {
        NSLog(@"加载失败");
        return [UIImage imageNamed:@"default"];
    }
    return image;
}

大家看到这儿发现与我们的runtime还没半毛钱关系,稍安勿躁。现在需求变这样:一个项目,已经开发迭代两年,以前都是用UIImage加载图片,但现在项目老大要我们对这个空图片的崩溃问题进行处理,一看看上面两个方法,懵逼中。。。。。。工程量太大,灯灯灯等!runtime登场:

流程:

 `提供分类`
 `写一个有这样功能的方法`
 `用这个方法跟系统方法进行方法交换`

分类中的新方法:

+ (void)load {

    // 获取类方法
    // class:获取哪个类的方法
    // SEL:获取哪个方法
    Method imageNameMethod = class_getClassMethod(self, @selector(imageNamed:));
    Method bj_imageNameMethod = class_getClassMethod(self, @selector(TJ_imageNamed:));

    // 交换方法的实现
    method_exchangeImplementations(imageNameMethod, TJ_imageNameMethod);
}

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

    UIImage *image = [UIImage imageNamed:name];

    if (image == nil) {
        NSLog(@"加载失败!\n");
        return [UIImage imageNamed:@"default"];
    }

    return image;
}

主线程直接调用:

[UIImage imageNamed:@"img1"];

方法交换示意图: Thumper


打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by 谭健,分享从这里开始,精彩与您同在


正在加载中……