iOS知识点 --- Runtime

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.mfbz.cn/a/555529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity开发holoLens2应用时的ProjectSettings配置

正确的进行Unity工程配置,才能进行后续的【发布】和【部署】操作… 本案例开发环境说明: Unity2021.3.18Win10VS2022HoloLens2 一、平台设置 二、Quality画面质量设置 三、Player玩家设置 四、XR-Plug设置 五、环境测试 导入一个官方demo&#xff0c…

EasyPoi表格导入添加校验

EasyPoi表格导入添加校验 项目添加maven依赖实体类自定义校验controller测试结果 代码地址 项目添加maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念&#xff1a;分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用&#xff1a;解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

紫光展锐携手中国联通智慧矿山军团(山西)完成RedCap现网环境测试

近日&#xff0c;紫光展锐与中国联通智慧矿山军团&#xff08;山西&#xff09;在现网环境下成功完成了RedCap技术测试。此次测试对搭载紫光展锐RedCap芯片平台V517的模组注网速度和信号情况、Iperf打流测试上下行情况、ping包延时情况以及模组拨号入网压测等项目进行了全面验证…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

韩顺平Java | C27 正则表达式

入门介绍 需求&#xff1a;提取文本中某类字符 传统方法&#xff1a;遍历每个字符&#xff0c;判断其是否在ASCII码中某种类型得编码范围内&#xff0c;代码量大&#xff0c;效率不高 正则表达式(RegExp, regular expression)&#xff1a;处理文本的利器&#xff0c;是对字符…

【详细介绍下图搜索算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Golang入门基础

文章目录 Golang的背景知识Golang的发展历程Golang的特点Golang的应用领域 开发环境搭建下载并安装SDK包设置环境变量Go项目目录结构 注释变量标识符命名输入和输出运算符算术运算符关系运算符逻辑运算符赋值运算符位运算符其他运算符 Golang的背景知识 Golang的发展历程 Gola…

高仿小米商城用户端

高仿小米商城用户端(分为商城前端&#xff08;tongyimall-vue)和商城后端(tongyimall-api)两部分)&#xff0c;是Vue SpringBoot的前后端分离项目&#xff0c;用户端包括首页门户、商品分类、首页轮播、商品展示、商品推荐、购物车、地址管理、下订单、扫码支付等功能模块。 …

Docker Volume (存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上…

「51媒体」权重高新闻源央级媒体邀约资料有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 权重高的央级媒体邀约资源包括了中国一些最具影响力和权威性的新闻机构。具体如下&#xff1a; 人民日报&#xff1a;作为中国共产党中央委员会的机关报&#xff0c;人民日报具有极高的权…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso

生产者,消费者,队列缓冲区,线程

public class CustomQueue {private BlockingQueue<Integer> queue;public CustomQueue() {// 初始化一个容量为1的阻塞队列queue new LinkedBlockingQueue<>(1);}public void put(int num) throws InterruptedException {// 将数字放入队列queue.put(num);}publi…

给一个新项目配置conda环境的完整流程

创建环境&#xff0c;并指定python的版本&#xff0c;我这边指定为3.7&#xff1a; conda create --name [自定义的环境名] python3.7我这边假定我的环境名为grand&#xff1a; conda create --name grand python3.7创建成功后&#xff0c;初始化一下conda&#xff1a; source …

Google DeepMind: Many-Shot vs. Few-Shot

本文介绍了如何通过增大上下文窗口&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;进行多实例上下文学习&#xff08;Many-Shot In-Context Learning&#xff0c;ICL&#xff09;的方法。主要描述了现有的几实例上下文学习方法虽然在推理时能够通过少量例子学习&…

基于Java+SpringBoot+vue动物救助平台设计和实现

基于JavaSpringBootvue动物救助平台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

树莓派使用总结

手上拿到了一块Raspberry Pi 4B板子。研究一下怎么用。 安装系统 直接到官网【Raspberry Pi 】下载在线安装助手 安装好后&#xff0c;打开软件&#xff0c;选择好板子型号、系统、TF卡&#xff0c;一路下一步就行。 树莓派接口 直接查看官方的资料【Raspberry Pi hardwar…

基础算法之二分算法

前言 本次博客&#xff0c;将要介绍二分算法的基本原理以及如何使用&#xff0c;深入浅出 二分可以针对整型以及浮点型接下来对其讲解希望对小白有所帮助吧 整型的二分法 一般要在一个数组中猜出一个数是否存在我们可以遍历一遍整个数组&#xff0c;判断是否存在&#xff0…

Java面向对象编程

标题&#xff1a;Java面向对象编程 文章目录 标题&#xff1a;Java面向对象编程前言&#xff1a;面向对象的三条主线一、面向对象编程概述1.1 程序设计思路1.2 Java语言的基本元素&#xff1a;类和对象1.3 对象的内存解析 二、类的成员1—成员变量2.1 “变量”定义&分类2.2…

蓝桥杯备赛

关闭同步流&#xff1a; ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 注意数据范围&#xff1a;数据范围较大时干脆所有变量类型都定义成longlong等。 stl&#xff1a; sort函数 时间复杂度为nlog(n); sort(数组指针&#xff0c;从指针开始多少个数&#xff0c;great…
最新文章