Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)

在这里插入图片描述

概览

承接上一篇博文:

  • Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(二)

我们在其中讨论了如何使用第三方强大通用的钩子库 SwiftHook 来协助我们完成 NSObject 构造器 init 的 SWIZZ 操作。我们还讨论了为什么用 print 打印对象信息时会发生崩溃,以及如何巧妙的解决它。

在这里插入图片描述

而在本篇博文中我们将来聊聊如何完全靠自己动手“丰衣足食”,来实现 SwiftHook 里相似的功能。

在本篇博文中,您将学到如下内容:

  • 概览
  • 5. 完全自己撸码真的“难如登天”吗?
  • 6 需要攻克的两个难关
  • 7. 让 ARC 不再“指手画脚”!
  • 总结

而在下一篇博文中,我们将解决最后一个难题,从而离“钩子”大冒险的终点更加的接近啦!

那么还等什么呢?让我们继续探幽未完成的冒险小径吧!

Let‘s dive in!!!😉


5. 完全自己撸码真的“难如登天”吗?

虽然我们还沉浸在 SwiftHook 完美 SWIZZ 的喜悦之中,但这毕竟是借助了第三方的力量。

我们能否彻底退出“复仇者联盟”,而完全靠自己撸码来尽可能实现 SwiftHook 的功能呢?

答案是:Yes and No!

是的,我们可以不通过 SwiftHook 来完成非常底层的系统调用,因为它是一个面面俱到、非常完善的钩子库。正是由于它的大而全导致其实现相对复杂,而我们在这里只需要挂载 NSObject.init 这一种情况下的钩子,所以我们可以直接无视其它各种“荆棘”的分支情况,集中全部精力做到极致简单。

不过,即使是这样我们仍然不能 100% 实现 SwiftHook 的功能,因为 FFI 调用对底层的稳定性来说太关键了。我们只能借助一些 Hack 机制来“无限逼近”SwiftHook 的结果。但所幸的是,这对于我们的使用场景来说已经足够了,更何况在“折腾让人快乐”的路途中我们可以学到良多,这就足矣了!

我们的战略目标是:不打算用任何第三方库来实现 NSObject.init 的钩子功能,包括 SwiftHook 和 FFI。

明确了目的,下面我们就来看看为什么之前那个“天真”的实现会让我们“死得很惨”。

6 需要攻克的两个难关

为了便于大家回忆,这里贴出之前的 Hook 代码:

class func tryHookNSObjectInit() {let oldInitSel = #selector<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/289130.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装?

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装? NTFS交换数据流(Alternate Data Streams, ADS)是NTFS文件系统特有的一种功能,它允许在同一个文件名下存储多个数据流。除了默认的数据流(通常用于存储文…

ExoPlayer架构详解与源码分析(12)——Cache

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

免费的CMS平台,免费CMS文章更新系统

随着网站建设的需求日益增加&#xff0c;寻找一款免费的CMS平台以及配套的文章更新系统成为了许多网站所有者的首要任务。本文将探讨免费的CMS平台的特点&#xff0c;以及CMS文章更新系统的作用和如何选择合适的系统。 免费的CMS平台的特点 开源免费&#xff1a;免费的CMS平台…

Ansible-1

Ansible是一款自动化运维、批量管理服务器的工具&#xff0c;批量系统配置、程序部署、运行命令等功能。基于Python开发&#xff0c;基于ssh进行管理&#xff0c;不需要在被管理端安装任何软件。Ansible在管理远程主机的时候&#xff0c;只有是通过各种模块进行操作的。 需要关…

mysql80-DBA数据库学习1-数据库安装

掌握能力 核心技能 核心技能 mysql部署 官网地址www.mysql.com 或者www.oracle.com https://dev.mysql.com/downloads/repo/yum/ Install the RPM you downloaded for your system, for example: yum install mysql80-community-release-{platform}-{version-number}.noarch…

JAVA虚拟机实战篇之GC调优[2](解决GC问题的手段)

文章目录 版权声明解决GC问题的手段优化基础JVM参数-Xmx 和 –Xms-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize-Xss虚拟机栈大小‐XX:SurvivorRatio和‐XX:MaxTenuringThreshold-XX:DisableExplicitGC 案例&#xff1a;垃圾回收器的选择复习&#xff1a;垃圾回收器的组合关系背…

vue 元素拖动,复制,已复制元素可移动,快捷方便,已解决

注意&#xff1a;使用当前组件时&#xff0c;请先了解组件代码逻辑 下方组件根据自己的需求来更改响应的元素id&#xff0c;调整代码实现逻辑&#xff0c;这里不过多解释 import Vue from "vue";/*** 拖拽*/ Vue.directive("Drag", (el) > {const move…

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改&#xff0c;表的增删查改&#xff0c;这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 1.创建Create 我们先创建…

深入解析MD5哈希算法:原理、应用与安全性

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 本文将深入探讨MD5哈希算法的工作原理、应用场景以及安全性问题。我们将了解MD5如何生成固定长度的哈希值&#xff0c;以及它在数…

BUG未解之谜01-指针引用之谜

在leetcode里面刷题出现的问题&#xff0c;当我在sortedArrayToBST里面给root赋予初始值NULL之后&#xff0c;问题得到解决&#xff01; 理论上root是未初始化的变量&#xff0c;然后我进入insert函数之后&#xff0c;root引用的内容也是未知值&#xff0c;因此无法给原来的二叉…

could not resolve com.android.tools.build:gradle:4.1.1.

一、报错信息 could not resolve com.android.tools.build:gradle:4.1.1.其实是因为你的网络不能从AS工程提供的mavenCentral()、google()和jcenter()等仓库下载相应的依赖。 二、解决方法 在build.gradle(Project)中&#xff0c;在原先的maven仓库前加上阿里云镜像源。这里…

如何遍历整个DOM树

原文链接&#xff1a;[如何遍历整个DOM树(外网原文链接)](https://chrisdeo.github.io/2019/07/20/%E5%A6%82%E4%BD%95%E9%81%8D%E5%8E%86%E6%95%B4%E4%B8%AADOM%E6%A0%91/) 作为前端开发工程师&#xff0c;我们大部分工作内容其实还是围绕着DOM在进行Javascript的编写&#xf…

SQL把统计结果作为条件进行查询

今天在社区看到一个问题如何返回 统计数值&#xff0c;比较简单&#xff0c;分享一下写法&#xff1a; --测试数据 if not object_id(NTempdb..#T) is nulldrop table #T Go Create table #T([name] nvarchar(21),[year] nvarchar(21),[time] nvarchar(22)) Insert #T select …

手写SpringBoot(二)之动态切换Servlet容器

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 文章目录 系列文章目录手写SpringBoot&#xff08;二&#xff…

KubeSphere简单介绍及安装使用

KubeSphere 概述 官网地址&#xff1a;https://kubesphere.io/zh/ 什么是 kubesphere KubeSphere 是一个开源的多云容器管理平台&#xff0c;旨在简化企业级 k8s 集群的部署、管理和运维。它提供了一个可视化的管理界面&#xff0c;帮助用户更轻松地管理和监控 k8s 集群&…

访问者模式(数据与行为解耦)

目录 前言 UML plantuml 类图 实战代码 SimpleFileVisitor FileVisitor 接口 删除指定文件夹 模板 IVisitor IVisitable Client 前言 一个类由成员变量和方法组成&#xff0c;成员变量即是类的数据结构&#xff0c;方法则是类的行为。 如果一个类的数据结构稳定&am…

超声波清洗机家用的哪家好?眼镜清洗器推荐!一分钟选购洗眼镜机

相信大家都知道&#xff0c;眼镜脏的话可以使用超声波清洗机清洁&#xff01;因为超声波清洗机能够通过振频的原理&#xff0c;对眼镜的污垢进行清洗。有的朋友会问&#xff0c;我手洗不可以吗&#xff1f;手洗当然可以&#xff0c;但是手洗对于镜片的清洗有作用&#xff0c;但…

【C语言】 gets()puts()fgets()fputs()字符串输入输出函数的用法

文章目录 C语言中的字符串输入输出函数&#xff1a;gets、puts、fgets与fputsgets函数puts函数fgets函数fputs函数 C语言中的字符串输入输出函数知识点总结结语 C语言中的字符串输入输出函数&#xff1a;gets、puts、fgets与fputs 在C语言中&#xff0c;处理字符串的输入和输出…

Java关键字之 assert

语法 assert关键字语法有两种用法&#xff1a; 1、assert <boolean表达式> 如果<boolean表达式>为true&#xff0c;则程序继续执行。 如果为false&#xff0c;则程序抛出AssertionError&#xff0c;并终止执行。 2、assert <boolean表达式> : <错误信…

翔云身份证实名认证接口-PHP调用方法

网络平台集成实名认证接口&#xff0c;是顺应当下网络实名制规定&#xff0c;有效规避法律风险。互联网平台若没有实名认证功能&#xff0c;那么便无法保证网民用户身份的真实性&#xff0c;很有可能被虚假用户攻击&#xff0c;特别是在当网络平台产生垃圾信息乃至是违法信息时…