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

news2024/11/15 21:35:00

在这里插入图片描述

概览

承接上一篇博文:

  • 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.coloradmin.cn/o/1542585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手摄影笔记-基础知识-按键和参数说明【1】

1. 相机正反面 2.顶部 3.屏幕 4.光圈、快门、感光度 什么是景深呢&#xff1f;景深就是照片中清晰和模糊的范围&#xff0c;也就是前后的距离。景深越深&#xff0c;意味着照片中清晰的范围越大&#xff0c;前后的距离越长&#xff0c;背景越清晰。景深越浅&#xff0c;意味着照…

个人博客系列-后端项目-系统角色配置(8)

系统角色配置需要设置的接口 用户可以绑定多个角色&#xff0c;角色对应有多个路由权限。用户绑定角色后&#xff0c;可以访问当前角色下的各个api路由和菜单路由。 用户注册时设置用户角色修改用户角色&#xff08;同时对应用户可以访问的路由将会同步变更&#xff09;添加修…

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 父组件引用&#xff1a; <script setup lang"ts"…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

酷炫的粒子动态表白HTML源码

源码介绍 酷炫的粒子动态表白HTML源码&#xff0c;自己自定义文字&#xff0c;动态组合文字&#xff0c;进行表白&#xff0c;喜欢的朋友可以下载使用&#xff0c;很不错的表白HTML代码 下载地址 酷炫的粒子动态表白HTML源码

Set A Light 3D Studio中文--- 打造专业级3D照明效果

Set A Light 3D Studio是一款专业的灯光模拟软件&#xff0c;专为摄影师和电影制片人打造。它允许用户在计算机上模拟并预览各种布光效果&#xff0c;助力拍摄出真实、精准且具有艺术感的作品。软件提供了丰富的灯光和场景模型&#xff0c;用户可以灵活调整光源参数&#xff0c…

优化金融展厅设计,细节提升客户体验与实用效能

“很赚钱”大部分公众对金融行业的第一印象&#xff0c;这足以见得金融行业在社会经济发展中的重要性&#xff0c;而为了更好的宣传和科普金融相关信息&#xff0c;金融展厅的设计和建设成为了重要措施&#xff0c;它能够充分展示金融机构的实力、品牌形象和服务优势&#xff0…

使用Django实现信号与消息通知系统【第154篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中&#xff0c;实现消息通知系统是至关重…

【Hadoop大数据技术】——Hadoop高可用集群(学习笔记)

&#x1f4d6; 前言&#xff1a;Hadoop设计之初&#xff0c;在架构设计和应用性能方面存在很多不如人意的地方&#xff0c;如HDFS和YARN集群的主节点只能有一个&#xff0c;如果主节点宕机无法使用&#xff0c;那么将导致HDFS或YARN集群无法使用&#xff0c;针对上述问题&#…

网络协议栈--传输层--UDP/TCP协议

目录 本节重点一、再谈端口号1.1 再谈端口号1.2 端口号范围划分1.3 认识知名端口号(Well-Know Port Number)1.4 回答两个问题1.5 netstat1.6 pidof 二、UDP协议2.1 UDP协议段格式2.2 UDP的特点2.3 面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议2.7 UDP…

【Linux】nmcli命令详解

目录 ​编辑 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的…

基于ssm的酒店民宿管理系统的设计与实现

系统主要功能介绍&#xff1a; 1、登录&#xff1a;输入账号密码进行登录&#xff0c;登录后才能进行相应的操作 2、客房管理&#xff1a;客房管理主要是酒店预订&#xff0c;可以选择不同的房间&#xff0c;比如大床房&#xff0c;家庭房等&#xff0c;入住办理&#xff0c;…

DC电源模块的设计与调试技巧

BOSHIDA DC电源模块的设计与调试技巧 DC电源模块的设计与调试是电子工程师在实际项目中常常需要面对的任务。一个稳定可靠的DC电源模块对于电路的正常运行起到至关重要的作用。以下是一些设计与调试的技巧&#xff0c;帮助工程师们更好地完成任务。 第一&#xff0c;正确选择…

【项目管理后台】Vue3+Ts+Sass实战框架搭建二

Vue3TsSass搭建 git cz的配置mock 数据配置viteMockServe 建立mock/user.ts文件夹测试一下mock是否配置成功 axios二次封装解决env报错问题&#xff0c;ImportMeta”上不存在属性“env” 统一管理相关接口新建api/index.js 路由的配置建立router/index.ts将路由进行集中封装&am…

2014年发射的SAR卫星传感器

2014年有多颗SAR卫星发射。包括Sentinel-1A、ALOS-2、SAOCOM 1A、SMAP。 Sentinel-1A 欧空局&#xff08;ESA&#xff09;的Sentinel-1A卫星发射于2014年4月3号&#xff0c;计划发射两颗&#xff0c;载荷为C波段SAR。 Sentinel-1延续了ERS-2和Envisat的观测任务。它具有更快…

宝贝的甜蜜梦乡:新生儿睡眠的温馨指南

引言&#xff1a; 新生儿的睡眠是他们健康成长的重要组成部分&#xff0c;良好的睡眠不仅有助于宝宝的身体发育&#xff0c;还对他们的认知和情绪发展至关重要。然而&#xff0c;新生儿的睡眠模式与成人不同&#xff0c;需要家长们特别关注和照顾。本文将为您介绍新生儿睡眠时间…

linux之zabbix自定义监控

zabbix基本配置见&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/136783672 自定义监控规则 命令为who | wc -l 显示为2&#xff0c;主机一个&#xff0c;mobaxterm一个&#xff0c;思路是开启3个终端&#xff0c;让主机的zabbix服务自动检测1…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…

neo4j所有关系只显示RELATION,而不显示具体的关系

当看r时&#xff0c;真正的关系在properties中的type里&#xff0c;而type为“RELATION” 造成这个的原因是&#xff1a; 在创建关系时&#xff0c;需要指定关系的类型&#xff0c;这是固定的&#xff0c;不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…

【MyBatis】初始化过程

MyBatis 初始化过程 可以分为以下几个步骤&#xff1a; 添加依赖&#xff1a;首先&#xff0c;需要在项目的 pom.xml&#xff08;如果是 Maven 项目&#xff09;或 build.gradle&#xff08;如果是 Gradle 项目&#xff09;文件中添加 MyBatis 以及数据库驱动的依赖。 配置文…