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. ...
随机推荐
- php.ini 开发和线上配置的差异
比对了一下php自带的php.ini-development和php.ini-production,备忘. display_errors = Ondisplay_startup_errors = On ...
- thinphp5框架遇到 mkdir() Permission denied 解决办法
网站重装 直接复制本地程序文件 里面数据库链接信息要改成线上的 然后mysql apache 等都没有动 运行后出现错误 mkdir() Permission denied 这是由于runtime目录 ...
- 如何在spring-boot web项目中启用swagger
swagger的三个项目及其作用 我们打开swagger的官网,会发现有三个swagger相关的项目,它们分别是 swagger-editor 作用是通过写代码,生成文档描述(一个json文件或其他格 ...
- 线程的信号量Semaphore
线程和进程一样也有信号量,一个资源在同一时刻只有规定数量的线程能使用.
- 在elementUI中使用 el-autocomplete 实现远程搜索的下拉框
参考;https://blog.csdn.net/qq_37746973/article/details/78402812?utm_source=blogxgwz1 https://blog.csdn ...
- hibernate11--Criteria查询
public class EmpTest { Session session =null; Transaction transaction=null; @Before public void befo ...
- ApplicaitionContext妙用request解耦合
本文记录一个web应用中,如果要获取request对象怎么获取,本次主要思考来自看到上次文件必须把request对象放进service层导致的疑问,然后学习总结之. 第一,也是我们最常用的,在cont ...
- json转换学习
文章部分代码实体类可以忽略. 原文:https://www.cnblogs.com/free-dom/p/5801866.html 代码如下: package covert; import java. ...
- Mastering MariaDB 神秘的MariaDB 中文翻译版
是某群的哥们义务翻译的,宣传一下,还没时间时间读,粗滤看了全部翻译完了300多页佩服 https://github.com/CMant/Mastering-MariaDB- 原地址:如果你需要读,请s ...
- windows7,python3使用time.strftime()函数报ValueError: embedded null byte
windows7环境下,执行代码报ValueError: embedded null byte时,在原代码前面加一行代码:locale.setlocale(locale.LC_ALL,'en')即可解 ...