首页 > 学院 > 开发设计 > 正文

Runtime - 方法交换

2019-11-06 09:40:27
字体:
来源:转载
供稿:网友

    //创建URL    //该方法不安全,string错误时也不会报错,需要加入判断    NSURL *url = [NSURL URLWithString:@"www.baidu.com/哈哈哈"];    if (url == nil) {        NSLog(@"url 为空");    }//打印结果:

//如何把创建url创建的代码不做任何改变就添加为空判断?

添加一个URL的分类 NSURL+ChangeMethods(使用该分类甚至不需要导入头文件)

//  NSURL+ChangeMethods.h#import <Foundation/Foundation.h>@interface NSURL (ChangeMethods)+ (instancetype)WSY_URLWihString:(NSString *)string;@end

//  NSURL+ChangeMethods.m#import "NSURL+ChangeMethods.h"#import <objc/message.h>  //此处一定要导入@implementation NSURL (ChangeMethods)//加载这个分类时候调用的生命周期方法+ (void)load{    //获取对象方法,第一个参数为对象 第二额参数为Method方法对象    //class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)        //获取类方法,第一个参数为类Class 第二额参数为Method方法对象    //class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)    //交换方法的实现 method_exchangeImplementations(<#Method m1#>, <#Method m2#>)        //获取方法名称    Method URLMethod = class_getClassMethod([NSURL class], @selector(URLWithString:));    Method WSYMethod = class_getClassMethod([NSURL class], @selector(WSY_URLWihString:));    //交换方法实现    method_exchangeImplementations(URLMethod, WSYMethod);}//此处方法已与URLWithString:交换+ (instancetype)WSY_URLWihString:(NSString *)string{    NSURL *url = [NSURL WSY_URLWihString:string]; //因为方法名已交换,此处实质是调用了URLWithString:    if (url == nil) {        NSLog(@"这个Url为空");    }    return url;}@end

再次回到控制器,重新初始化URL

NSURL *url = [NSURL URLWithString:@"www.baidu.com/哈哈哈"];运行 

查看结果

总结:

类似于UIImage imageWithNamed:这一类的系统类的这类初始化方法都可以采用此方法加一道安全监测

开发时可以用来监测,发布时最好改回原来正常代码


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表