Objective-C Runtime方法替換引發(fā)的死循環(huán)

當執(zhí)行下面問題代碼:

NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/中文字符串"];
NSLog(@"url:%@",url);

打印日志:顯示null
2019-09-03 18:09:59.087098+0800 RACUse[1761:2943445] url:(null)

所以當我們對類似系統(tǒng)方法進行攔截或者優(yōu)化時, 往往使用運行時的方法交換

1.創(chuàng)建一個URL的擴展類NSURL+KKURL.h / NSURL+KKURL.m

  1. 導入runtime
    2.在+ (void) load { }方法 中添加代碼
@implementation NSURL (KKURL)

+ (void)load {
//系統(tǒng)url方法
    Method urlM = class_getClassMethod([self class], @selector(URLWithString:));
//新的url方法
    Method urlNewM = class_getClassMethod([self class], @selector(KKURLWithString:));
//交換方法
    method_exchangeImplementations(urlM, urlNewM);
}


+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self KKURLWithString:URLString];
    if (url) {
        return url;
    } else {
        NSLog(@"無效url");
        return [NSURL new];
    }
}

我們注意到KKURLWithString:里面為啥是:

    NSURL *url = [self KKURLWithString:URLString];

而不是:

    NSURL *url = [self URLWithString:URLString];//會導致循環(huán)
image.png

其實現(xiàn)在URLWithString:URLString 調(diào)用的是KKURLWithString:URLString方法,
KKURLWithString:URLString調(diào)用的是URLWithString:URLString方法,

所以下面代碼會導致死循環(huán):

+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self URLWithString:URLString];

...
}

相反,下面方法正常:

+ (nullable instancetype)KKURLWithString:(NSString *)URLString {
    NSURL *url = [self KKURLWithString:URLString];
...
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,681評論 1 32
  • 一、Runtime簡介 object-c是基于C語言加入了面向?qū)ο筇匦院拖⑥D(zhuǎn)發(fā)機制的動態(tài)語言,除編譯器之外,還需...
    蕭修閱讀 392評論 0 2
  • 本文翻譯自http://www.raywenderlich.com/63338/grand-central-dis...
    隨風飄蕩的小逗逼閱讀 307評論 0 0
  • 如果不裝X,跟咸魚又有什么區(qū)別了。聽了一節(jié)關(guān)于runtime相關(guān)的課程,這里第一時間做個筆記,方便自己過后的復習。...
    MR_詹閱讀 666評論 4 6
  • 技術(shù)無極限,從菜鳥開始,從源碼開始。 由于公司目前項目還是用OC寫的項目,沒有升級swift 所以暫時SDWebI...
    充滿活力的早晨閱讀 12,848評論 0 2

友情鏈接更多精彩內(nèi)容