zoukankan      html  css  js  c++  java
  • iOS 运行时使用(交换两个方法)

    举例 在创建了如下代码 

    NSString *str=nil;
        NSURL *url =[NSURL URLWithString:str];
        NSLog(@"%@",url);

    但是想使用自己的方法并对传入的字符串做为空判断

    举例 自己写了一个方法 

    +(instancetype)SJUrlWithStr:(NSString *)str 替代系统方法

    [NSURL URLWithString:]

      但是如果项目现在已经进行到了后期 就会涉及到很多界面要导入头文件 并修改使用这个方法 很不方便

    那么可以自己新建一个URL的分类 在分类中使用运行时交换两个系统的方法和自己的方法快速的实现方法交换

    #import "NSURL+Extension.h"
    #import <objc/message.h>
    @implementation NSURL (Extension)
    
    +(void)load{
        //获取系统方法结构体
        Method system = class_getClassMethod([self class], @selector(URLWithString:));
        //获取自己方法结构体
        Method own = class_getClassMethod([self class], @selector(SJUrlWithStr:));
        // 交换方法 系统的 URLWithString 和自己的 SJUrlWithStr
        //交换自己方法和系统方法
        method_exchangeImplementations(system, own);
        //以后再使用 URLWithString 的时候 其实是在调用SJUrlWithStr
    }
    
    +(instancetype)SJUrlWithStr:(NSString *)str{
        if (str==nil) {
            NSLog(@"字符串为空");
            return nil;
        }
        // 下面的 SJUrlWithStr 其实是使用了 URLWithString
        NSURL *url = [NSURL SJUrlWithStr:str];
        return url;
    }
    
    @end
  • 相关阅读:
    Bootstrap 可视化布局--拖拽后弹窗进行编辑
    Missing letters
    DNA Pairing
    Pig Latin
    Search and Replace
    Where art thou
    Roman Numeral Converter
    Diff Two Arrays
    Sum All Numbers in a Range
    Caesars Cipher
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/9131414.html
Copyright © 2011-2022 走看看