runtime实战(二)动态修改方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shaohua_lv/article/details/71057045

在上篇博文上大家了解了什么是runtime,并了解OC的消息发送机制,下面就进入runtime实战,解决实际问题:动态修改方法

一、我们经常使用的NSURL方法如下:

NSURL *url = [NSURL URLWithString:@"www.xxx.华为"];

当字符串中有中文时,url为空,在使用时会加一个判空操作。如果使用地方很多,在每处都加上判空,会使代码相当繁琐。

二、有朋友想添加一个类目,自己声明一个方法:

NSURL+url.h:

@interface NSURL (url)

+ (instancetype)SH_URLWithString:(NSString *)string;

@end

NSURL+url.m:

@implementation NSURL (url)

+ (instancetype)SH_URLWithString:(NSString *)string
{
    NSURL *url = [NSURL URLWithString:string];
    if (url == nil) {
        // Handle the nil exception;
        NSLog(@"the urlString is nil");
    }

    return string;
}

@end

当然,这个方法是可行性,我们每次使用这个自定义方法便可实现效果,但是对于大的项目,在每个文件中导入头文件,并且每次都记得使用该方法,显然有些繁琐。

三、接下来我们就使用runtime来动态的修改系统方法:

NSObject方法:

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}

+ (void)load;

该方法会在工程编译时被调用,在main函数之前,我们想要改系统方法时机,就是在这个方法被调用时。


#import "NSURL+url.h"
#import <objc/message.h>

@implementation NSURL (url)

// 当这个文件被加载进来时被调用,在main函数之前,文件被编译时,程序启动之前;
+ (void)load
{
    // 1.获取系统URLWithString方法
    Method URLWithStr = class_getClassMethod([NSURL class], @selector(URLWithString:));

    // 2.获取自定义的SHURLWithString方法
    Method SHURLWithStr = class_getClassMethod([NSURL class], @selector(SH_URLWithString:));

    // runtime方法之一:交换两个方法的实现。
    method_exchangeImplementations(URLWithStr, SHURLWithStr);

}

// 如果修改了系统的方法,请添加注释
+ (instancetype)SH_URLWithString:(NSString *)string
{
    NSURL *url = [NSURL SH_URLWithString:string];
    if (url == nil) {
        // Handle the nil exception;
        NSLog(@"the urlString is nil");
    }

    return nil;
}

@end

load中的三个runtime方法分别获取到了系统的URLWithString方法,和自定义的SH_URLWithString方法,然后交换了这两个方法的实现,
所以以后我们使用系统的URLWithString方法。

NSURL *url = [NSURL URLWithString:@”www.xxx.华为”];

其实内部已经进行了判空操作。

我的GitHub代码地址:https://github.com/lvshaohua/SH_Runtime

猜你喜欢

转载自blog.csdn.net/shaohua_lv/article/details/71057045