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 == ) {
aString = @"输入的字符串为空哦!!";
} /*
因为已经交换了方法,所以在这里调用 sjx_stringByAppendingString: 实际为 stringByAppendingString:
如果这里写 stringByAppendingString: 会造成死循环
*/
return [self sjx_stringByAppendingString:aString];
} @end
GitHub:https://github.com/sjxjjx/runtime_exchangeMethod
iOS项目之交换方法(runtime)的更多相关文章
- iOS项目常用效果方法注意点集锦
移动中隐藏tabBar,静止显示tabbar - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { // 隐藏tabbar ...
- ios开发runtime学习二:runtime交换方法
#import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...
- ios - runtime运行时应用---交换方法
runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...
- (iOS)项目总结-项目中遇到的各种的问题和解决方法
前言: 一到公司报道那时,便着手独立的去完成了一个项目,其中的辛酸泪也是不足为外人道也.这次算是一个新型的app,仍然是独立开发,但心境和想法却是完全的不同.下面说一次以前做开发时常常忽略的知识,也算 ...
- Runtime 交换方法
创建UIImage分类UIImage+Image.h #import<UIKit/UIKit.h> @interfaceUIImage (Image) + (__kindof UIImag ...
- iOS项目的完整重命名方法图文教程
原文链接:http://www.cocoachina.com/ios/20150104/10824.html iOS项目的完整重命名方法图文教程 前言:在iOS开发中,有时候想改一下项目的名字,都会遇 ...
- Unity iOS 项目的一种性能评测方法
[Unity iOS 项目的一种性能评测方法]
- ios项目生成ipa文件方法
做这些的前提是你配置好了所有的证书,如果还没先去配置证书吧. 1.打开需要生成ipa的ios项目.2.在运行按钮的后面选择ios Device3.点击Product 按钮,选择第五个Archive4. ...
- ios项目里扒出来的json文件
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...
随机推荐
- 公开的免费WebService接口分享
天气预报Web服务,数据来源于中国气象局 Endpoint Disco WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endpoint Disco WSDL 随机英文 ...
- JavaScript 事件绑定函数
function panTest(m_onClickFun) { var This = this; This.onClickFun = m_onClickFun; /* This.onClickFun ...
- mysql数据库转成oracle踩过的坑
1.使用count这种组函数,那么必须配合group by使用,获取的字段要么出现在组函数内要么出现在group by中2.oracle使用union不仅要字段名一致并且数据类型也要一致3.REGEX ...
- js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...
- filter的知识点 和 实例
一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理 2.快速入门 步骤: 1)编写一个 ...
- HTTP状态码--含义
以下是HTTP状态码(HTTP Status Code)及其解释 1xx(临时响应) (继续) 请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. (切换协议) 请 ...
- python语法_while循环_for循环
while 循环: while 条件: print('''asdasd') print('''asdasd') print('''asdasd') 当条件为True时,持续循环 当条件为Flase时, ...
- SQL Server 将查询结果导出插入的简单方式
https://blog.csdn.net/danny_style/article/details/45166391 1.首先将查询结果添加到一个原数据库中不存在的表,表名随意命名. 例: selec ...
- FakeGame 集成总结
1.64位支持(目前编译不过); 2.Dx9? 2.以何种方式提供(源码?工程版本(VS2005还是其他)): 3.是否可以连接TC的服务器进行调试? TDR编解码失败: 不同目录下存在a.lib的不 ...
- 树莓派3 之 pi3Robot 控制系统配置
需求 个人正在用Python写一个控制系统,技术选型是python3 + Flask + Mysql + Bootstrap.需要将这套系统直接部署到树莓派中. 代码地址:https://github ...