iOS知识点 --- Runtime

news/2024/9/25 21:25:11/

Objective-C (OC) 中的 Runtime 原理:

Objective-C Runtime 是一套用于支持 Objective-C 动态特性的底层 C 语言 API。它为 Objective-C 提供了以下核心功能:

  1. 动态类型:在运行时确定对象的确切类型,允许在程序执行过程中进行类型检查、类型转换以及动态派发消息。

  2. 动态绑定(Message Dispatch):在发送消息(方法调用)时,Runtime 系统会在运行时查找并调用对应的方法实现。这种延迟绑定机制使得 Objective-C 可以支持方法重写、多态等特性。

  3. 动态加载:支持在运行时动态地加载新的类和协议,以及添加、替换或移除方法、属性等元数据。

  4. 动态方法解析与消息转发:当发送的消息无法在当前对象的类中找到实现时,Runtime 提供了动态方法解析机制尝试生成方法实现,如果失败则启动消息转发流程,允许开发者定制消息处理逻辑。

  5. 反射与元编程:Runtime 提供了查询和操作类、对象、协议、选择器(方法名)等元数据的能力,如获取类的所有方法列表、属性列表、实例变量等,甚至可以动态地创建类、添加属性或方法等。

使用场景包括但不限于:

  • Method Swizzling:交换两个方法的实现,常用于在不修改原有代码的情况下,对系统的某些行为进行拦截、扩展或监控。

  • KVC(Key-Value Coding)与 KVO(Key-Value Observing):基于 Runtime 实现的间接访问和观察对象属性的机制。

  • 实现动态代理:通过转发消息实现透明代理,可以用来实现数据驱动的界面、AOP(面向切面编程)等。

  • 实现泛型和其他高级编程模式:利用 Runtime 的反射能力实现一些编译时难以实现或者需要大量模板代码的功能。

Swift 中的 Runtime 相关机制:

Swift 作为一门现代编程语言,其设计初衷包含了静态类型检查和编译时优化的特点,与 Objective-C 的动态性有所不同。然而,Swift 并非完全不具备运行时特性,而是提供了一种混合式的方法来支持必要的动态行为:

  1. Swift 标准库中的动态特性:Swift 标准库包含了一些动态行为的支持,如反射(Mirror)、类型擦除(AnyObject 和 Any)、协议扩展等,这些功能在一定程度上类似于 Runtime 的部分功能,但通常更为安全且受编译器严格控制。

  2. 与 Objective-C Runtime 的互操作性:Swift 类可以通过继承自 NSObject 或标记为 @objc 来获得与 Objective-C Runtime 的兼容性。这意味着它们可以参与消息传递机制,进行 Method Swizzling、KVC/KVO 等操作,并能被 Objective-C 代码所识别和调用。

  3. dynamic 关键字:在 Swift 中,使用 dynamic 关键字修饰的方法或属性,可以强制 Swift 编译器将这些成员的访问转为动态派发,类似于 Objective-C 中的方法调用。这使得它们能够在运行时被修改或替换,符合 Runtime 使用场景的需求。

综上所述,尽管 Swift 本身并不具备与 Objective-C 完全相同的 Runtime 机制,但它确实提供了与 Objective-C Runtime 的互操作性,并通过标准库及关键字(如 @objcdynamic)来支持特定的动态行为和使用场景。对于那些需要高度动态特性的任务,Swift 开发者可以选择利用这些特性或者结合 Objective-C Runtime 来实现。而对于大多数常规开发,Swift 更倾向于鼓励使用静态类型和编译时优化的技术来提高性能和安全性。


http://www.ppmy.cn/news/1427316.html

相关文章

常用node.js命令有哪些呢?

前言 Node.js 是一种在服务器端运行 JavaScript 的开放源代码、跨平台 JavaScript 运行环境。 1、查看当前安装的 Node.js 版本。 node -v 或 node --version 2、查看当前安装的 npm 版本。 npm -v 或 npm --version 3、初始化一个新的 Node.js 项目,会生成一个 pac…

算法学习——LeetCode力扣补充篇11(64. 最小路径和、48. 旋转图像 、169. 多数元素、394. 字符串解码、240. 搜索二维矩阵 II )

算法学习——LeetCode力扣补充篇11 64. 最小路径和 64. 最小路径和 - 力扣(LeetCode) 描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只…

【C++】飞机大战项目记录

源代码与图片参考自《你好编程》的飞机大战项目,这里不进行展示。 本项目是仅供学习使用的项目 飞机大战项目记录 飞机大战设计报告1 项目框架分析1.1 敌机设计:1.2 玩家飞机控制:1.3 子弹发射:1.4 游戏界面与互动:1.5…

PF滤波?

粒子滤波 本文是对于原文的学习与部分的转载 https://blog.csdn.net/weixin_44044161/article/details/125445579 粒子滤波是在目标跟踪中常用的一种方法 非线性条件下,贝叶斯滤波面临一个重要的问题是状态分布的表达与积分式的求解 由前面章节中的分析可以得知…

Okhttp 403 Forbidden

android App 在使用okhttp下载全国中小企业股份转让系统的pdf文件时候,下载完成后使用MuPDF无法解析,提示文件损坏或者不是PDF文件,查看Okhttp的下载请求,发现报403 Forbidden错误: {protocol=http/1.1, code=403, message=Forbidden, url=https://www.neeq.com

.NET 设计模式—备忘录模式(Memento Pattern)

简介 备忘录模式,又称之为快照模式(Snapshop Pattern),是一种行为型设计模式,,它允许在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们…

数据库-Redis(14)

目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步骤…