iOS开发_HOOK

2023-11-01

我们在使用NSURLRequest时,传入请求地址URL,但是如果URL中有中文的话,我们会发现NSURLRequest的请求地址会报空

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/中文"];
    NSURLRequest * request =[NSURLRequest requestWithURL:url];
    NSLog(@"%@",request);
}
//2018-04-23 10:08:23.719236+0800 003-HOOK[947:5550247] <NSURLRequest: 0x60400000e6d0> { URL: (null) }

那我们有没有办法改进呢?做下尝试

我们创建一个继承自NSURL的类,命名为HOOK,然后新建一个方法

#import <Foundation/Foundation.h>

@interface NSURL (HOOK)

+(instancetype)HK_URLWithString:(NSString *)URLString;

@end
#import "NSURL+HOOK.h"

@implementation NSURL (HOOK)

+(instancetype)HK_URLWithString:(NSString *)URLString{
    NSURL * url = [NSURL URLWithString:URLString];
    if(url ==nil){
        NSLog(@"空了");
    }
    return url;
}
@end

此时我们需要在ViewController.h导入NSURL+HOOK.h文件,还需要修改调用的方法名HK_URLWithString

#import "ViewController.h"
#import "NSURL+HOOK.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL * url =[NSURL HK_URLWithString:@"http://www.baidu.com/中文"];
    NSURLRequest * request =[NSURLRequest requestWithURL:url];
    NSLog(@"%@",request);
}

//2018-04-23 10:30:38.145984+0800 003-HOOK[1168:5566807] 空了
//2018-04-23 10:30:38.146393+0800 003-HOOK[1168:5566807] <NSURLRequest: 0x604000200480> { URL: (null) }

那有没有更简洁的方式呢?可以利用Runtime运行时改变方法调用的顺序,在NSURL+HOOK.m文件修改

//
//  NSURL+HOOK.m
//  003-HOOK
//
//  Created by mac on 2018/4/23.
//  Copyright © 2018年 mac. All rights reserved.
//  哪里HOOK?
/**
 利用Runtime运行时改变方法调用的顺序
 */

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

@implementation NSURL (HOOK)

+(void)load{
    //获取两个Method
    Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
    Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
    //交换方法的IMP
    method_exchangeImplementations(URLWithStr, HKWithStr);
}
//重写URLWithString
//+(instancetype)URLWithString:(NSString *)URLString{
//    NSURL * 
//}
+(instancetype)HK_URLWithString:(NSString *)URLString{
    NSURL * url = [NSURL URLWithString:URLString];
    if(url ==nil){
        NSLog(@"空了");
    }
    return url;
}
@end

此时,我们在ViewController.h文件还是使用最初的代码,一个代码都不需要修改

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/中文"];
    NSURLRequest * request =[NSURLRequest requestWithURL:url];
    NSLog(@"%@",request);
}

我们就可以达到我们的目的,这种方式叫做方法欺骗。利用的就是runtime的HOOK。

但是我们发现程序并没有我们想象的顺利运行,而是卡死了
这里写图片描述

这是因为我们修改了消息发送时候真正的方法实现。

这里写图片描述

我们在ViewController中调用URLWithString方法,实际运行的是HK_URLWithString,而在NSURL+HOOK.m文件中我们调用了URLWithString方法,实际运行的仍然是它本身,所以就不会不断循环,导致程序内存暴增,而卡死崩溃。那我们怎么解决呢?很简单,我们把NSURL+HOOK.m文件中的URLWithString替换成HK_URLWithString

这里写图片描述

#import "NSURL+HOOK.h"
#import <objc/runtime.h>
@implementation NSURL (HOOK)
+(void)load{
    //获取两个Method
    Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
    Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
    //交换方法的IMP
    method_exchangeImplementations(URLWithStr, HKWithStr);
}
//重写URLWithString?
//+(instancetype)URLWithString:(NSString *)URLString{
//    NSURL * 
//}
+(instancetype)HK_URLWithString:(NSString *)URLString{
    NSURL * url = [NSURL HK_URLWithString:URLString];
    if(url ==nil){
        NSLog(@"空了");
    }
    return url;
}
@end

在运行,我们发现就可以达到我们所设想的目的。我们可以不需要修改原来项目中的代码,仅仅把NSURL+HOOK.h和NSURL+HOOK.m拖进项目中就可以实现了

2018-04-23 11:22:36.367259+0800 003-HOOK[1748:5624887] 空了
2018-04-23 11:22:36.367636+0800 003-HOOK[1748:5624887] <NSURLRequest: 0x604000019110> { URL: (null) }

gitHub示例:https://github.com/Goddreamwt/iOS_HOOK.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发_HOOK 的相关文章

随机推荐

  • 爬取中国大学排名并以csv格式存储

    爬取中国大学排名并以csv格式存储 import requests from bs4 import BeautifulSoup import bs4 def get content url try user agent Mozilla 5
  • linux下使用gitee搭建hexo个人博客(完全免费)

    在linux下使用gitee搭建hexo个人博客 一 前言 什么是 Hexo Hexo是一个快速 简洁且高效的博客框架 Hexo使用Markdown 或其他渲染引擎 解析文章 在几秒内 即可利用靓丽的主题生成静态网页 什么是gitee 大家
  • 网络协议详解 :UDP

    目录 网络存在的问题 网络传送的不可靠 网络不安全 传输层的UDP UDP工作机制 应用层观察UDP的特点 缺点 优点 UDP Header结构 checksum 校验和 UDP接收缓冲区 缓冲区概念 接收缓冲区 UDP发送成功现象 UDP
  • C++ 基础: std::string

    一 常见的使用 std string是C 标准库中的一个类 用于表示可变长度的字符串 它是由字符类型 通常是char 的数组实现的 并提供了许多字符串操作函数 std string的构造函数有多种形式 可以用于初始化空字符串 从字符数组或另
  • IntelliJ IDEA 学习笔记 - 首次使用IntelliJ IDEA

    本文记录首次打开IntelliJ IDEA的情况 参考IntelliJ IDEA 简体中文专题教程 英文好的同学可以查看英文官网文档 1 打开 IntelliJ IDEA 是没有类似 Eclipse 的工作空间的概念 Workspaces
  • C++/Python机器学习—逻辑回归

    一 Python import numpy as np import matplotlib pyplot as plt 定义sigmoid函数 def sigmoid x return 1 1 np exp x 定义训练函数 def tra
  • HTML5新增API FileReader 显示缩略图

    div class content div
  • 【Java】继承——子类与父类有同名属性的情况。

    package TcmStudy day20 class Father public int a 10 public int b 20 class Son extends Father public int a 20 public void
  • 【Vue项目搭建】修改【若依框架】的侧边栏、导航栏、面包屑样式、修改全局页面样式

    掌握分寸感 找目标一致的人协同你 有效地调配资源 就可以提高效率 写在前面的话 博主最近想要搭建自己的前端若依项目 因此此系列博客会做一些记录 我的项目gitee地址 https gitee com xuruicong rachel fro
  • Window关闭端口的方法(445/135/137/138/139/3389等)

    为防止漏洞被利用 需要采取必要措施 关闭以上端口 以保证系统更加安全 window2003 关闭135端口的方法 要关闭此端口 只需停止DCOM接口服务即达到目的 下面是详细操作过程 1 打开 组件服务 控制台 按 WIN R 组合键打开运
  • 爱填坑的喵哥——windows10下docker开启失败、下载镜像失败的坑

    操作系统 win10 1803版 docker版本 18 03 1 ce build 9ee9f40 喵哥最近开始用windows版的docker 说实话win10上的docke
  • VGA接口驱动

    实验原理 计算机显示区的显示有许多标准 常见的有 VGA SVGA 等 在这里我们用 VGA 接口来控制显示器 VGA 即 Video Graphics Array 的缩写 也就是视频图形阵 列 作为一种标准的显示接口得到广泛的应用 常见的
  • FindObjectsOfType查找所有物体 数组归纳 弹开的力 unity笔记47

    FindObjectsOfType lt 类型 gt 不要少s 少了就是另个函数 返回 场景中找到的与指定类型匹配的对象数组 见官方文档 如果场景中匹配类型的对象个数为0 那返回的就是数组长度为0 分解 一方面是数组长度 数组 length
  • 微信小游戏开发入门(一)-基础知识

    技术简介 微信小游戏是在微信小程序的基础上添加了游戏库 API 小游戏只能运行在小程序环境中 所以小游戏既不是原生游戏 也不完全等同于 HTML5 游戏 但实际上小游戏面向的就是 HTML5 游戏开发者 为了能够让 HTML5 游戏低成本移
  • 银行理财子公司的“超级”玩法

    银行理财子公司的 超级 玩法 周纯 邬川 资管云 3天前 作者丨周纯 邬川 来源丨棱镜 ID lengjing qqfinance 原标题丨银行理财子公司的 超级 玩法 棱镜 在金融行业回归本源的监管大趋势下 国有大行再一次在准入方面拔得头
  • ClickHouse(二十三):Java &Spark读写ClickHouse API

    进入正文前 感谢宝子们订阅专题 点赞 评论 收藏 关注IT贫道 获取高质量博客内容 个人主页 含各种IT体系技术 IT贫道 Apache Doris 大数据OLAP体系技术栈 Kerberos安全认证 CSDN博客 订阅 拥抱独家专题 你的
  • 毕业设计-基于机器学习的建筑能耗预测

    目录 前言 课题背景和意义 实现技术思路 一 建筑能耗数据预处理 二 公共建筑能耗特征分析 三 基于机器学习的建筑能耗预测模型建模 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备
  • myEclipse/eclipse中properties文件中文乱码问题解决方案

    myEclipse eclipse中properties文件中文乱码问题解决方案 有时候在myeclipse或者eclipse中打开properties文件时会发现其中的中文都是乱码 这是由于当前的properties文件编码格式不支持汉字
  • 修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像

    大家斗志到Maven默认连接的仓库位置https repo maven apache org maven2访问国外镜像下载东西时相对较慢 所以多数朋友想切换到国内镜像 国内阿里已经给大家提供了一套完整的镜像供大家使用 Maven默认连接的仓
  • iOS开发_HOOK

    我们在使用NSURLRequest时 传入请求地址URL 但是如果URL中有中文的话 我们会发现NSURLRequest的请求地址会报空 void viewDidLoad super viewDidLoad NSURL url NSURL