在項目中够委,經(jīng)常會遇到系統(tǒng)自帶的方法滿足不了自己的需求荐类,往往我們解決這種情況的時候,都是在分類中添加一個方法茁帽。然而很多時候玉罐,項目已經(jīng)開發(fā)很長時間了,如果一個一個的去替換系統(tǒng)的方法潘拨,太浪費寶貴的時間吊输,所以在這里介紹使用runtime來交換方法。
在這里寫了一個小案例:
在項目中使用stringByAppendingString:方法铁追,判斷拼接的字符串是否為nil季蚂,如果為nil,則改為@""琅束,避免項目崩潰扭屁。
在這里要替換的方法是NSString的系統(tǒng)方法,所以在這里創(chuàng)建一個NSString的分類涩禀。因為在這里需要使用到runtime料滥,需要導入#import <objc/runtime.h>頭文件。在 + (void)load 方法中交換方法即可埋泵。下面將代碼附上:
#import "NSString+ExchangeMethod.h"
#import <objc/runtime.h>
@implementation NSString (ExchangeMethod)
+ (void)load
{
// 獲取系統(tǒng)的對象方法
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 = @"輸入的字符串為空哦aE贰!";
}
/*
因為已經(jīng)交換了方法丽声,所以在這里調(diào)用 sjx_stringByAppendingString: 實際為 stringByAppendingString:
如果這里寫 stringByAppendingString: 會造成死循環(huán)
*/
return [self sjx_stringByAppendingString:aString];
}