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];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,776评论 0 9
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,211评论 30 472
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,733评论 7 64
  • 最近一直在想着尝试做一些新的事情,之前没做过,自己又很想做的事情。我就一直在想,如果要做一件事情,哪些是需要我自己...
    A一心向上阅读 286评论 1 1
  • 今天我们集体去比斯特购物中心了,那儿的东西吊牌价是英镑,进去之后都对人民币没有概念了,完全忘记了一英磅折合人民币约...
    蔡春琴阅读 358评论 0 0