zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    Codeforces Round #632 (Div. 2)
    Codeforces Round #630 (Div. 2)
    多项式全家桶
    Educational Codeforces Round 84 (Rated for Div. 2)
    【cf1186E】E. Vus the Cossack and a Field(找规律+递归)
    [CF847B] Preparing for Merge Sort
    [CF858D] Polycarp's phone book
    [CF911D] Inversion Counting
    [CF938C] Constructing Tests
    [CF960C] Subsequence Counting
  • 原文地址:https://www.cnblogs.com/sjxjjx/p/6543587.html
Copyright © 2011-2022 走看看