RunTime 方法交换 NSURL 空值处理

RunTime 消息机制

Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。

消息机制是运行时里面最重要的机制,OC是动态语言,本质都是发送消息,每个方法在运行时会被动态转化为消息发送,即:objc_msgSend(receiver, selector)

RunTime 官方API

NSURL 空值处理 使用runtime方法交换 :

创建NSURL分类 在分类中直接修改URLWithString:做非空判断不可行,但是又希望URLWithString:方法能做非空处理,这个时候可以分类中创建一个新的类方法SL_URLWithString做非空处理,再通过runtime实现两个方法交换,调用系统方法URLWithString实际调用的是SL_URLWithString;

下面是NSURL分类。

//
//  NSURL+url.h
//  iOS_study00
//
//  Created by Datacvg on 2019/9/6.
//  Copyright © 2019 Datacvg. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSURL (url)
+(instancetype)SL_URLWithString:(NSString*)URLString;
@end

NS_ASSUME_NONNULL_END
//
//  NSURL+url.m
//  iOS_study00
//
//  Created by Datacvg on 2019/9/6.
//  Copyright © 2019 Datacvg. All rights reserved.
//

#import "NSURL+url.h"
#import <objc/runtime.h>

@implementation NSURL (url)
+(void)load
{
    /**
        在类加载方法里面使用RunTime实现方法交换(URLWithString与SL_URLWithString)
        load加载比init alloc都早
        没有使用NSURL类也会加载(程序运行就会加载)
        NSURL+url.m在Build Phases -> Compile Sources 里面原文件参与编译
     */
    //class_getInstanceMethod :获取对象方法
    //class_getClassMethod: 获取类方法

    Method URLWithString = class_getClassMethod([NSURL class], @selector(URLWithString:));
    Method SLURLWithString =  class_getClassMethod([NSURL class], @selector(SL_URLWithString:));
    //交换
    method_exchangeImplementations(URLWithString, SLURLWithString);
}
+(instancetype)SL_URLWithString:(NSString *)URLString
{
    //方法交换后SL_URLWithStringy对应系统方法URLWithString
    NSURL * url = [NSURL SL_URLWithString:URLString];
    if (url == nil) {
        NSLog(@"url为空");
    }
    return url;
}
@end

参考: 视频课程iOS Runtime详解

原文地址:https://www.cnblogs.com/lulushen/p/11473809.html

时间: 2024-10-15 01:38:43

RunTime 方法交换 NSURL 空值处理的相关文章

快速上手Runtime(三)之方法交换

开发过程中,我们经常会用到系统类,而它提供的方法又不能完全满足我们开发的需要,那么在此时,我们需要为系统自带的方法扩展一些功能,而且还要保证原有的功能可正常使用.假设咱们现在有这么一个需求,我们在调用系统的[UIImage imageNamed:@"runtime"];的时候,我们并不能判断有没有加载成功,所以我们想在加载图片的时候并判断是否加载成功. 方案1: 我们通常想到的就是分类,用分类添加一个方法,实现,然后在想要调用的地方导入头文件,去调用. #import <UIKi

Runtime 应用(一)拦截系统自带的方法交换实现

动态的交换方法能够给项目中大量已经使用的方法 进行拦截增加操作 实践:利用运行时交换系统的ImageNamed:方法 应用背景 当系统需要适配ios7和ios8时可能会有显示不同图片的需求,但在老项目上开发ios7程序时并未考虑到ios8的适配,当项目上有几百处地方用到ImageNamed:方法时,如果选用最直接的办法,在该方法之前进行判断,如果为ios8就显示另外一张图片,这样的工作量明显会很大,所以可以用运行时的方法来解决. 新建一个项目,准备两张图片,一张图片名为close为ios7而准备

ios runtime之交换方法method_exchangeImplementations的使用

最常见的情况字体的适配 UIFont新建分类重写Load方法 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Menlo; color: #78492a; background-color: #ffffff } span.s1 { color: #272ad8 } #define SCALE(s)  ((s) / 375.0 * SCREEN_WIDTH) p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; f

iOS 为何使用runtime多次方法交换后却能按照交换顺序依次执行代码逻辑?

题目: 假设我们有一个ViewController, Category A(ViewController), Category B(ViewController), Category C(ViewController) 4个文件, 其中3个category中都实现了自定义viewDidLoad方法, 会对ViewController中的ViewDidLoad方法进行方法替换, 那么依次替换后(A B C)的方法执行顺序是什么呢? 记method_exchangeImplementations(M

runtime 方法替换 和 动态添加类方法 结合使用

原文地址:runtime 方法替换 和 动态添加类方法 结合使用 前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法. 缺陷:1.含参数的方法难以处理,参数值需要根据实际业务逻辑而定.2.无法实现动态添加实例方法. Create Person.h and Person.m Person.h: 12345 #import <Foundation/Foundation.h> @int

运行时之方法交换

在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写.和借助类别重名方法暴力抢先之外,还有就是方法交换 方法交换的原理:在OC中调用一个方法其实是向一个对象发送消息,查找消息的唯一依据是selector的名字.利用OC的动态特性,可以实现在运行时偷换selector方法的实现,达到和方法挂钩的目的. 每一个类都有一个方法列表,存放在selector的名字和方法实现的映射关系,imp有点像函数指针,指向具体的方法实现. 可以利用method_exchanggeimplement

iOS开发大招-使用运行时runtime方法给一个类添加属性

看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性, 比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性? 他是如何实现的呢? 1.基本的实现思路 首先我们需要了解,实际上 在我们使用  类似于self.newProperty的语句的时候, 根据点语法的规则实际上是调用的  setNewProperty方法,和  newProperty方法, 那我们可以知道他肯

runtime --- 方法实现交换

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000 } span.s1 { } 方法欺骗  使用 runtime 进行两个方法的交换 + (void)load { //获取类方法 Method olld = class_getClassMethod([self class], @selector(URLWithString:)); Method new = class_getClassMethod(

Runtime 方法替换 和 动态添加实例方法 结合使用

前言:方法替换,可以替换任意外部类的方法,而动态添加方法只能实现在被添加类创建的对象里,但是将方法替换和动态添加方法结合使用,可以实现,对任意外部类动态添加需要的方法,这个方法可以是类方法也可以是实例方法,这个外部类也可以是没有任何方法声明和实现的类. 主要思路:使用运行时的方法替换将在外部类将自定义方法hy_resolveInstanceMethod或hy_resolveClassMethod(用hy_前缀表示是我自定义的方法)和需要被添加的类中的resolveInstanceMethod或者