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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM