在项目中,常常会遇到系统自带的方法知足不了本身的需求,每每咱们解决这种状况的时候,都是在分类中添加一个方法。然而不少时候,项目已经开发很长时间了,若是一个一个的去替换系统的方法,太浪费宝贵的时间,因此在这里介绍使用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