在项目中,经常会遇到系统自带的方法满足不了自己的需求,往往我们解决这种情况的时候,都是在分类中添加一个方法。然而很多时候,项目已经开发很长时间了,如果一个一个的去替换系统的方法,太浪费宝贵的时间,所以在这里介绍使用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

  

转载于:https://www.cnblogs.com/sjxjjx/p/6543587.html

iOS项目之交换方法(runtime)相关推荐

  1. [Runtime]-交换方法

    为什么80%的码农都做不了架构师?>>>    1:比如我们有个需求:让UIImage加载图片的时候,告诉我们是否加载成功了 前言: /**  Runtime(交换方法):只要是想修 ...

  2. ios项目生成ipa文件的真正简单可用的方法

    首先要有证书,没有证书请飘过 然后打开需要生成ipa的ios项目. 在运行按钮的后面选择ios Device 然后点击Product 按钮,选择第五个Archive 这时候会弹出几次要密钥的警告框,只 ...

  3. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  4. iOS 项目源码大全 github 国内外大神

    github排名https://github.com/trending,github搜索:https://github.com/search 主要工作说明: 重新整理了Xcode好用的插件,信息更详细 ...

  5. 消除Xcode iOS项目的警告

    消除Xcode iOS项目的警告 作者  犯傻小二  关注 2016.03.10 15:22*  字数 8287  阅读 3839 评论 0 喜欢 7 如果你有强迫症,看到项目中那么多警告肯定特别心烦 ...

  6. iOS项目开发实战——开发基于Handoff的App(Swift)

    iOS8推出一个新特性,叫做Handoff.Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行.这个在iOS8 ...

  7. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    2016年GitHub 排名前 100 的安卓.iOS项目简介(收藏)   排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android ...

  8. iOS 项目整体是竖屏,个别页面支持横屏

    最近在做一个视频APP,工程整体是竖屏的,如下图,播放器需支持横屏.在转屏的过程遇到很痛苦的问题.[UIApplication sharedApplication].statusBarOrientat ...

  9. IOS项目之分层MVVM

    在做.Net时,有用到三层架构,使项目分层.ios项目使用AFNetWork把网络层这块也放进了ViewController中,数据解析缓存这些也在里面,这样层次结构可能不够清楚,今天就试着分离了一下 ...

最新文章

  1. 【PP】SAP库存决定
  2. 【ArcGIS风暴】在ArcGIS中实现将一个圆16等分
  3. Thrift 异步模式
  4. Delphi – 我的代码之简单五子棋
  5. 我发现有的人就活该他赚钱,他们的脑子就是个聚宝盆
  6. Linux LVM动态扩容
  7. 【c4d学习笔记】OC渲染器安装问题
  8. 《算法导论》 第28章 矩阵运算
  9. uboot移植之迷雾解码
  10. 基于GoogleMap,Mapabc,51ditu,VirtualEarth,YahooMap Api接口的Jquery插件的通用实现(含源代码下载) --转...
  11. AI仿生:人类进化新可能
  12. 记一次投稿springer期刊,利用tex排版文稿
  13. 3D-2D三维重建:PnP
  14. power Designer VBS 脚步 通过 excel 生成实体,不用一个一个的输入。
  15. live555 日志
  16. 几种简单方法找回丢失的IE图标
  17. javascript H5解决手机拍照图片被旋转问题
  18. 3D打印机开源项目遭克隆或成开源拐点
  19. 语音广播服务器,Luna云语音平台广播系统
  20. 计算机网络--2020春-平时小测2--习题答案

热门文章

  1. 用php获取本周,上周,本月,上月,本季度日期的代码
  2. DOM中的onbeforeunload函数
  3. 用Redis快速实现BloomFilter!
  4. linux查看与修改交换内存配置(解决zabbix-agent启动报错)
  5. 树网的核(codevs 1167)
  6. Lucene查询索引(分页)
  7. ffmpeg常用转换命令,支持WAV转AMR
  8. Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压...
  9. vue click事件冒泡,默认行为
  10. 集合框架源码学习之HashMap(JDK1.8)