深入解析 ObjC 中方法的结构

2023-10-31


因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。

在上一篇分析 isa 的文章从 NSObject 的初始化了解 isa中曾经说到过实例方法被调用时,会通过其持有 isa 指针寻找对应的类,然后在其中的 class_data_bits_t 中查找对应的方法,在这一篇文章中会介绍方法在 ObjC 中是如何存储方法的。

这篇文章的首先会根据 ObjC 源代码来分析方法在内存中的存储结构,然后在 lldb 调试器中一步一步验证分析的正确性。

方法在内存中的位置

先来了解一下 ObjC 中类的结构图:

objc-method-class

  • isa 是指向元类的指针,不了解元类的可以看 Classes and Metaclasses
  • super_class 指向当前类的父类
  • cache 用于缓存指针和 vtable,加速方法的调用
  • bits 就是存储类的方法、属性、遵循的协议等信息的地方

class_data_bits_t 结构体

这一小结会分析类结构体中的 class_data_bits_t bits

下面就是 ObjC 中 class_data_bits_t 的结构体,其中只含有一个 64 位的 bits 用于存储与类有关的信息:

objc-method-class-data-bits-t

在 objc_class 结构体中的注释写到 class_data_bits_t 相当于 class_rw_t 指针加上 rr/alloc 的标志。

class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags  

它为我们提供了便捷方法用于返回其中的 class_rw_t * 指针:

class_rw_t* data() {
     
   return (class_rw_t *)(bits & FAST_DATA_MASK);
}

将 bits 与 FAST_DATA_MASK 进行位运算,只取其中的 [3, 47] 位转换成 class_rw_t * 返回。

在 x86_64 架构上,Mac OS 只使用了其中的 47 位来为对象分配地址。而且由于地址要按字节在内存中按字节对齐,所以掩码的后三位都是 0。

因为 class_rw_t * 指针只存于第 [3, 47] 位,所以可以使用最后三位来存储关于当前类的其他信息:

objc-method-class_data_bits_t

#define FAST_IS_SWIFT           (1UL<<0)
#define FAST_HAS_DEFAULT_RR     (1UL<<1)
#define FAST_REQUIRES_RAW_ISA   (1UL<<2)
#define FAST_DATA_MASK          0x00007ffffffffff8UL
  • isSwift()
    • FAST_IS_SWIFT 用于判断 Swift 类
  • hasDefaultRR()
    • FAST_HAS_DEFAULT_RR 当前类或者父类含有默认的 retain/release/autorelease/retainCount/_tryRetain/_isDeallocating/retainWeakReference/allowsWeakReference方法
  • requiresRawIsa()
    • FAST_REQUIRES_RAW_ISA 当前类的实例需要 raw isa

执行 class_data_bits_t 结构体中的 data() 方法或者调用 objc_class 中的 data()方法会返回同一个 class_rw_t * 指针,因为 objc_class 中的方法只是对 class_data_bits_t 中对应方法的封装。

// objc_class 中的 data() 方法
class_data_bits_t bits;

class_rw_t *data() {
     
   return bits.data();
}

// class_data_bits_t 中的 data() 方法
uintptr_t bits;

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

深入解析 ObjC 中方法的结构 的相关文章

  • iOS开发—RunLoop详解

    随着oc语言不断迭代 苹果的API也是逐步完善 RunLoop在实际开发中应用的越来越少 但是在面试中 假如面试官问你RunLoop的相关知识了解 那就相当于面试官在问你从事iOS开发工作的真实年限问题 那么下面我们就详细了解一下RunLo
  • 将APP程序发布到iPhone或iPad上去测试

    转载至 http www appshare cn thread 3123 1 1 html 图文的介绍版本 http fstoke me blog tag apple 绝大多数iPhone Developer Distribution 的代
  • 两个app应用之间的跳转

    一 应用跳转的原理 从一个应用跳转到另一个应用 作为APP开发者 最熟悉的莫过于第三方登录 支付宝 微信支付时 那时候我们可能仅仅按照集成文档一步一步操作 在文档中配置很多类似URL Schemes 如下图 一般的配置 下面我们进入正题的为
  • iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

    本章项目demo https github com zhonggaorong alipayDemo 支付宝支付大致流程为 1 公司与支付宝进行签约 获得商户ID partner 和账号ID seller 和私钥 privateKey 开发中
  • ios-常见的命令行工具

    pwd 查看当前目录 cat 在命令行中查看文件 ls 查看文件 ls l 就是以列表的形式展开 touch 创建文件 open 打开文件 more 分页查看文件内容 f是下一页 b是上一页 当你命令行有很多东西你写错了的时候不想去一一删除
  • ios10.3之CoreData的详细教程

    首先如果要使用CoreData可以选择在初创项目时选择添加coredata 也可以选择自己添加coredata文件 系统添加coredata后会在Appdelegate类中自动添加一个persistentContainer属性 和一个sav
  • iOS-Andriod百度地图仿百度外卖-饿了么-选择我的地址-POI检索/

    http zanderzhang gitcafe io 2015 09 19 iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索 title iOS Andriod百度地图仿百度外卖 饿了么 选择我的地址 POI检索
  • iOS 15 适配踩坑:NavigationBar、UITabBar失效问题

    苹果前两天推出了iOS 15 秋天都等不及 相关链接 ios 15 0 适配问题 NavigationBar和UITabBar失效问题 Xcode 13 beta版 iOS 15 beta 3的系统 除了客户提出的问题 自己还发现了两处UI
  • iOS内购-防越狱破解刷单

    2018 10 16更新 最近我们公司丢单率上涨 尤其是10月份比9月份来说丢单率翻了3倍 和一些同行交流了一下 发现他们也是丢单量增加 初步推断可能是苹果iOS12的原因 某些情况下会有用户内购成功后 却返回的是订单失败 错误类型为SKE
  • 2018年最优秀的第三方框架汇总

    实时搜索 AutoCompleteTextView AutoCompleteTextView 是一个实时刷选控件 根据输入框中的文本信息进行筛选 View的部分都已经封装好 业务部分自己实现 都以以Block的形式回掉 简单实用 现在已经支
  • ad Hoc打包测试

    一 iOS证书 首先介绍一下iOS证书 iOS证书分两种 1 开发证书 用来给你 开发人员 做真机测试 2 发布证书 又分为两种 发布到app store 和发布测试的ad hoc证书 本文就详细讲解 ad hoc证书的创建 二 什么时候用
  • iOS左对齐自动换行collection样式

    前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定 以此向右对齐排列的样式UI可以说是很常见的 实现方式 一般的实现可能主要是分一下两种 1 一种是用button依次排列实现 动态计算text宽度 记录之前一个
  • iOS App上架流程

    前言 作为一名IOS开发者 把开发出来的App上传到App Store是必须的 下面就来详细介绍下具体流程 1 打开苹果开发者中心 https developer apple com 打开后点击 Member Center 如果你的电脑没有
  • UITableView性能优化-一次面试后的反思总结

    面试的时候遇到这个问题 竟一时没有全答上来 于是Google了一下 常见的一些譬如Cell重用 设计统一Cell 缓存Cell高度 Cell数据资源缓存 这些其实平时都在用 但因为平时还是缺乏总结 回答这么个问题的时候却只想到说 重用 缓存
  • Swift open public等修饰符详解

    swift 中关于open public internal fileprivate private 修饰的说明 open 用open修饰的类可以在本某块 sdk 或者其他引入本模块的 sdk module 继承 如果是修饰属性的话可以被此模
  • 【ios开发技术】Swift 语言深入--Swift设计模式 (2/2)

    Getting Started 让我们开始 你可以下载the project source from the end of part 1与我们共同来探索 这是你在第一部分结束时完成的音乐库App样品 应用程序的最初设计包括在屏幕的顶端上上水
  • iOS中自动消失提示框的实现

    iOS中自动消失提示框的实现 添加一个提示框 UIAlertView alert UIAlertView alloc initWithTitle 提示 message 你很漂亮 delegate self cancelButtonTitle
  • iOS App打包上架详细流程

    一 前言 作为一名iOS开发者 把辛辛苦苦开发出来的App上传到App Store是件必要的事 但是很多人还是不知道该怎么上传到App Store上 下面就来详细讲解一下具体流程步骤 二 准备 一个已付费的开发者账号 可分为 账号类型分为个
  • 自定义modal转场动画,滑动手势控制 dismiss 过程

    效果 假设有 1 两个视图控制器 presentingVC presentedVC 2 一个继承于UIPercentDrivenInteractiveTransition 并遵守协议UIViewControllerAnimatedTrans
  • iOS代码混淆初探

    iOS代码混淆初探 在没有对应用的代码做过特殊处理的情况下 一般应用的代码中的类名和方法都是明文的 在逆向分析中 通过class dump获取MachO可执行文件中的所有类 定义的方法和属性 就能很快的从名字入手猜到这个方法是做什么用的 所

随机推荐

  • webpack发布

    当我们项目开发完成后 需要发布上线 而我们通过webpack dev server的插件打包的文件是存在于内存上的 物理磁盘上并不存在 所以我们需要将内存中的项目复制一份到物理磁盘上 方法 在package json文件中的scripts中
  • 计算机英语学习笔记&深度学习

    学习资料来源于 Robust Face Recognition via Multimodal Deep Face Representation Changxing Ding Student Member IEEE Dacheng Tao F
  • Linux系统下通过TCP与UDP方式建立简易的客户端与服务器之间的连接

    TCP方式 服务器函数 include head h define IP 192 168 31 38 define PORT 2023 int main int argc const char argv 创建套接字socket int sf
  • Oracle快速入门

    目录 快速了解 Oracle SQL Server和MySQL优劣与选择 查看是否开启oracle服务 常用终端命令 常用数据类型 常用运算符 DDL 公司项目推荐写法 DML DQL 特殊关键字 函数 PL SQL 特点和优势 PL SQ
  • 浏览器报错DNS_PROBE_FINISHED_BAD_CONFIG的解决办法

    版权声明 转载请注明作者 独孤尚良dugushangliang 出处 https blog csdn net dugushangliang article details 103047975 是日 发现百度搜索出现问题 起初以为这爆出来一个
  • 满二叉树已知先序,求后序。

    哈哈哈 基金这两天没眼看了 现在看啥都是绿的 题目 已知满二叉树的先序序列 求其后序序列 算法思想 其实做这类题型的时候 咱们可以找一个具体的实例 来找相应的规律 举个例子 先根 1245367 后根 4526731 由例子可以很清晰的看出
  • 定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter

    定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter 1 自定义SpringBoot Starter 三要素 1 1 pom
  • (无需root)在termux中使用esptool为ESP8266/ESP32刷写固件

    不说废话 直接走起 下载一个termux 百度一下 给termux换源 百度一下 装python apt install python python pip python cryptography 给pip换源 百度一下 装esptool
  • 模拟退火算法——概率法解全局优化

    1 直观介绍 模拟退火算法来源于固体退火原理 是一种基于概率的算法 将固体加温至充分高 再让其徐徐冷却 加温时 固体内部粒子随温升变为无序状 内能增大 而徐徐冷却时粒子渐趋有序 在每个温度都达到平衡态 最后在常温时达到基态 内能减为最小 它
  • K8S指南-平滑升级与自动扩缩容

    目录 1 k8s指南 概述 2 k8s指南 架构 3 k8s指南 工作负载 1 4 k8s指南 工作负载 2 5 k8s指南 工作负载 3 6 k8s指南 工作负载 4 7 k8s指南 Service 8 k8s指南 Ingress 9 k
  • SV结构体格式化打印

    原文链接 https verificationguide com systemverilog systemverilog struct PACKED STRUCT EXAMPLE module struct tb typedef struc
  • 使用python读取csv文件

    用python读取文件的操作是很常见的 所以在这里记录一下相关的操作步骤 有参考这篇博客 https www cnblogs com unnameable p 7366437 html 文件的读取 1 首先你得有一个csv文件 可以把exc
  • 五种方法创建 Java 对象,你知道几种呢?

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 Rock
  • 2. 区块链到底是怎么运行的

    这一篇文章我将以比特币区块链为例来进行讲解 理由有两个 由于区块链发展到目前阶段 各个技术方向都有长足的发展 介绍最简单 最容易理解的比特币区块链 由于大部分区块链都是以比特币区块链为基础进行扩充的 所以了解比特币区块链有助于其他项目区块链
  • 测试同学怎么参与codereview

    前言 Code Review 简称CR 也就是我们常说的代码评审 Code Review主要是在开发过程中 对代码进行评审 其目的是为了提高代码质量和规范性 尽早发现潜在缺陷与BUG 降低修复成本 同时也可以提高开发者自身水平 现在越来越多
  • 红客联盟是什么?红客需要传承!

    红客联盟 Red Hacker Alliance 是一个中国黑客组织 成立于2000年 该组织由一群对计算机技术和网络安全感兴趣的年轻人组成 致力于通过网络攻击和黑客行为来抗议政府 企业和个人 在过去的二十年中 红客联盟已经成为中国最著名的
  • C++STL详解(十一)-- 位图(bitset)

    文章目录 位图的介绍 位图的引入 位图的概念 位图的应用 位图的使用 位图的定义 位图的成员函数 位图运算符的使用 位图的模拟实现 成员函数 构造函数 set reset test flip size count none any all
  • [Android]多进程知识点详解

    作者 Android开发 Hua 链接 https www jianshu com p e0f833151f66 多进程知识点汇总 一 了解多进程 二 项目中多进程的实现 三 多进程的优缺点与使用场景 四 Android跨进程通讯实现 五
  • 晨读-为什么人会越活越沉默?

    有很多人都有一种可以称之为 被动沉默 的困扰 在社交场合中一开始说话 就会容易陷入紧张焦虑 在意周围的目光 明明心里有很多的想法和意见 但就是在关键时刻脑子一片空白 表达不出来或者不敢表达 特别渴望与人交流 也知道与人交流是好事情 但就是无
  • 深入解析 ObjC 中方法的结构

    因为 ObjC 的 runtime 只能在 Mac OS 下才能编译 所以文章中的代码都是在 Mac OS 也就是 x86 64 架构下运行的 对于在 arm64 中运行的代码会特别说明 在上一篇分析 isa 的文章从 NSObject 的