Runtime 学习-方法交换

来源:互联网 发布:知乎python入门 编辑:程序博客网 时间:2024/05/17 06:03

应用场景有很多,因为系统很多方法是不报错误的,我们就可以换成自己的方法,加入一些提示或者判断

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    NSURL *url=[NSURL URLWithString:@"www.baidu我"];    NSLog(@"%@",url);    }
#import "NSURL+Help.h"#import <objc/message.h>@implementation NSURL (Help)/*    runtime 方法交换原理      selectorA  指向  IMPa     selectorB  指向  IMPb     交换之后     selectorA  指向  IMPb     selectorB  指向  IMPa      *///load方法会在main方法之前调用,在类加载到内存的时候调用 只会调用一次+(void)load{    //获取类方法    Method system= class_getClassMethod(self, @selector(URLWithString:));    Method myMethod= class_getClassMethod(self, @selector(myURLWithString:));    //交换方法    method_exchangeImplementations(system, myMethod);}//判断url 是否为空+(NSURL *)myURLWithString:(NSString *)str{    //这个地方调用自己的方法,调用系统的,就指向自己的方法实现,会造成死循环    NSURL *url=[NSURL myURLWithString:str];    if (url == nil) {        NSLog(@"url为空");    }    return url;}@end




原创粉丝点击