iOS項目之交換方法(runtime)


  在項目中,經常會遇到系統自帶的方法滿足不了自己的需求,往往我們解決這種情況的時候,都是在分類中添加一個方法。然而很多時候,項目已經開發很長時間了,如果一個一個的去替換系統的方法,太浪費寶貴的時間,所以在這里介紹使用runtime來交換方法。

  在這里寫了一個小案例:

  在項目中使用stringByAppendingString:方法,判斷拼接的字符串是否為nil,如果為nil,則改為@"",避免項目崩潰。

  在這里要替換的方法是NSString的系統方法,所以在這里創建一個NSString的分類。因為在這里需要使用到runtime,需要導入#import <objc/runtime.h>頭文件。在 + (void)load 方法中交換方法即可。下面將代碼附上:

#import "NSString+ExchangeMethod.h"
#import <objc/runtime.h>

@implementation NSString (ExchangeMethod)

+ (void)load
{
    // 獲取系統的對象方法
    Method stringByAppendingStringMethod = class_getInstanceMethod(self, @selector(stringByAppendingString:));
    
    // 獲取自己定義的對象方法
    Method sjx_stringByAppendingStringMethod = class_getInstanceMethod(self, @selector(sjx_stringByAppendingString:));
    
    // 方法交換
    method_exchangeImplementations(stringByAppendingStringMethod, sjx_stringByAppendingStringMethod);
}

- (NSString *)sjx_stringByAppendingString:(NSString *)aString
{
    if (aString == nil || aString.length == 0) {
        aString = @"輸入的字符串為空哦!!";
    }
    
    /*
     因為已經交換了方法,所以在這里調用 sjx_stringByAppendingString: 實際為 stringByAppendingString: 
     如果這里寫 stringByAppendingString: 會造成死循環
     */
    return [self sjx_stringByAppendingString:aString];
}

@end

GitHub:https://github.com/sjxjjx/runtime_exchangeMethod

  


免責聲明!

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



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