在項目中,常常會遇到系統自帶的方法知足不了本身的需求,每每咱們解決這種狀況的時候,都是在分類中添加一個方法。然而不少時候,項目已經開發很長時間了,若是一個一個的去替換系統的方法,太浪費寶貴的時間,因此在這裏介紹使用runtime來交換方法。git
在這裏寫了一個小案例:github
在項目中使用stringByAppendingString:方法,判斷拼接的字符串是否爲nil,若是爲nil,則改成@"",避免項目崩潰。spa
在這裏要替換的方法是NSString的系統方法,因此在這裏建立一個NSString的分類。由於在這裏須要使用到runtime,須要導入#import <objc/runtime.h>頭文件。在 + (void)load 方法中交換方法便可。下面將代碼附上:code
#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