当前位置: 首页 > article >正文

Swift的方法派发机制

1. 静态派发(Static Dispatch)

静态派发在编译时确定方法的具体实现,调用时直接跳转到该实现。静态派发的优点是性能高,因为不需要运行时查找方法实现。

适用场景:
  • 值类型(Struct 和 Enum):值类型的方法默认使用静态派发。

  • Final 类和方法:标记为 final 的类或方法无法被继承或重写,因此使用静态派发。

  • 全局函数和静态方法:这些方法在编译时就能确定实现,使用静态派发。

示例:
struct Point {var x: Intvar y: Intfunc description() -> String {return "(\(x), \(y))"}
}let p = Point(x: 10, y: 20)
print(p.description())  // 静态派发

2. 动态派发(Dynamic Dispatch)

动态派发在运行时确定方法的具体实现。Swift 中的动态派发主要通过虚表(VTable)和消息转发(Message Forwarding)实现。

2.1 虚表派发(VTable Dispatch)

虚表派发是类方法默认的派发方式。每个类都有一个虚表,其中存储了该类所有可重写方法的指针。子类继承父类的虚表,并可以覆盖其中的方法指针。

适用场景:
  • 类的非 Final 方法:类的方法默认使用虚表派发,除非标记为 final

  • 继承和重写:子类可以重写父类的方法,运行时根据对象的实际类型调用正确的方法。

示例:
class Animal {func makeSound() {print("Some sound")}
}class Dog: Animal {override func makeSound() {print("Bark")}
}let animal: Animal = Dog()
animal.makeSound()  // 动态派发,输出 "Bark"
2.2 消息转发(Message Forwarding)

消息转发是 Objective-C 的派发机制,Swift 通过 @objc 和 dynamic 关键字支持这种派发方式。消息转发允许在运行时动态解析方法调用,甚至可以在运行时修改方法实现。

适用场景:
  • 与 Objective-C 交互:标记为 @objc 的方法使用消息转发。

  • 动态方法解析:标记为 dynamic 的方法使用消息转发,允许在运行时修改方法实现。

示例:
class MyClass {@objc dynamic func sayHello() {print("Hello")}
}let instance = MyClass()
instance.sayHello()  // 消息转发

3. 协议派发(Protocol Witness Table Dispatch)

协议方法使用协议见证表(Protocol Witness Table, PWT)进行派发。每个遵循协议的类型都有一个 PWT,其中存储了协议方法的实现指针。

适用场景:
  • 协议方法:协议中的方法默认使用 PWT 派发。

  • 泛型约束:泛型类型约束为协议时,使用 PWT 派发。

示例:
protocol Greetable {func greet()
}struct Person: Greetable {func greet() {print("Hello")}
}let greeter: Greetable = Person()
greeter.greet()  // 协议派发

4. 特殊场景

4.1 泛型方法派发

泛型方法在编译时生成特定类型的实现,通常使用静态派发。但如果泛型类型约束为协议,则使用协议派发。

示例:
func printGreeting<T: Greetable>(_ greeter: T) {greeter.greet()  // 协议派发
}let person = Person()
printGreeting(person)  // 输出 "Hello"
4.2 扩展中的方法派发

扩展中的方法默认使用静态派发,即使是对类类型的扩展。如果扩展中的方法被重写,仍然使用静态派发。

示例:
class MyClass {func sayHello() {print("Hello from MyClass")}
}extension MyClass {func sayGoodbye() {print("Goodbye from MyClass")}
}class SubClass: MyClass {override func sayHello() {print("Hello from SubClass")}// 无法重写扩展中的方法
}let instance: MyClass = SubClass()
instance.sayHello()  // 动态派发,输出 "Hello from SubClass"
instance.sayGoodbye()  // 静态派发,输出 "Goodbye from MyClass"
4.3 @objc 和 dynamic 方法

标记为 @objc 的方法使用消息转发,允许与 Objective-C 交互。标记为 dynamic 的方法也使用消息转发,允许在运行时修改方法实现。

示例:
class MyClass {@objc dynamic func sayHello() {print("Hello")}
}let instance = MyClass()
instance.sayHello()  // 消息转发
4.4 final 关键字

标记为 final 的类或方法无法被继承或重写,因此使用静态派发。

示例:
final class MyFinalClass {func sayHello() {print("Hello")}
}let instance = MyFinalClass()
instance.sayHello()  // 静态派发

总结

Swift 的方法派发机制灵活且高效,支持多种派发方式以适应不同的场景:

  • 静态派发:适用于值类型、Final 类和方法,性能最高。

  • 动态派发:适用于类的继承和重写,通过虚表派发。

  • 协议派发:适用于协议方法,通过协议见证表派发。

  • 消息转发:适用于与 Objective-C 交互和动态方法解析。

理解这些派发机制有助于编写高效且符合预期的 Swift 代码。

相关文章:

Swift的方法派发机制

1. 静态派发&#xff08;Static Dispatch&#xff09; 静态派发在编译时确定方法的具体实现&#xff0c;调用时直接跳转到该实现。静态派发的优点是性能高&#xff0c;因为不需要运行时查找方法实现。 适用场景&#xff1a; 值类型&#xff08;Struct 和 Enum&#xff09;&am…...

用户认证练习实验

一.拓扑 二.sw2配置 三.ip配置 四.dhcp分配IP地址 五.安全区域配置 六.防火墙地址组信息 七.管理员 创建管理员角色 创建管理员 启动tenlnet 八.用户认证配置 认证策略 九.安全策略配置...

Miniforge —— 轻量化的 conda 解决方案

引言 在日常使用中&#xff0c;我们常常使用 Anaconda 或 Miniconda 来管理 Python 环境和包。但由于 Anaconda/Miniconda 属于商业产品&#xff0c;当企业规模超过一定人数时就会涉及付费问题。相比之下&#xff0c;Miniforge 是由社区主导维护的一个完全免费的替代方案&…...

【登录认证】

目录 一. 会话技术1.1 cookie1.2 session1.3 令牌方案 二. JWT令牌三. 过滤器Filter四. 拦截器Interceptor \quad 一. 会话技术 \quad \quad 1.1 cookie \quad \quad 1.2 session \quad \quad 1.3 令牌方案 \quad \quad 二. JWT令牌 \quad \quad 三. 过滤器Filter \quad \quad …...

10bit VS 8bit 视频:色彩深度的较量,谁才是视觉盛宴的王者?

10bit 和 8bit 视频 10bit 视频和 8bit 视频的主要区别在于色彩深度和细节表现能力。10bit 视频具有更高的色彩深度和更丰富的细节表现,能够提供更平滑的色彩过渡和更真实的图像质量,但需要更多的存储空间和带宽。8bit 视频则在存储和传输方面更加高效,适合于对存储空间和带…...

DeepSeek 赋能智慧教育 | 讯方“教学有方”大模型全面接入 DeepSeek!

国产 DeepSeek 大模型以强大的深度学习能力和广泛应用场景迅速火爆全球&#xff0c;其在智能对话、文本创作、语义解析、计算推理、代码生成与补全等多个应用领域&#xff0c;展现出了无与伦比的实力和魅力。2月10日 &#xff0c;由讯方技术自研的教育行业大模型“教学有方”全…...

代码随想录算法营Day36 | 56. 合并区间,738. 单调递增的数字,968. 监控二叉树

56. 合并区间 每当遇到不重叠的区间就append到结果数组里&#xff0c;遇到重叠的就更新结果数组最后一位的区间的end值。 class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort()res []for start,end in intervals:if len(res…...

Unity中自定义协程的简单实现

在 Unity 中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种非常强大的工具&#xff0c;它允许我们在不阻塞主线程的情况下&#xff0c;将代码的执行分成多个步骤&#xff0c;在不同的帧中执行。 Unity中协程实现原理 迭代器与状态机&#xff1a;本质上是基于C#的迭…...

C++ 设计模式-单例模式

以下是一个使用 C 实现的线程安全单例模式示例&#xff0c;结合配置管理器的经典场景&#xff0c;并附带完整测试代码&#xff1a; #include <iostream> #include <unordered_map> #include <mutex> #include <thread> #include <vector> #incl…...

Ubuntu 上安装和配置 Apache RocketMQ 4.7.1

在 Ubuntu 上安装和配置 Apache RocketMQ 4.7.1 需要以下步骤。RocketMQ 是一个分布式消息队列系统&#xff0c;通常需要安装 Namesrv&#xff08;Name Server&#xff09;和 Broker 组件。 1. 系统准备 更新系统和安装依赖 运行以下命令更新系统并安装必要的依赖项&#xff…...

打开Visual Studio Code的时候发现未检测到适用于linux的windows子系统,那么该问题要如何解决?

两个月没有使用vscode编写代码&#xff0c;今天使用的时候发现了以上的问题导致我的vscode无法编写程序&#xff0c;接下来我将本人解决该问题的思路分享给大家。 首先我们要清楚WSL是适用于linux的window的子系统&#xff0c;是一个在Windows 10\11上能够运行原生Linux二进制可…...

Linux(socket网络编程)TCP连接

Linux&#xff08;socket网络编程&#xff09;TCP连接 基础文件目录函数系统进程控制函数fork()exec系列函数void abort(void)void assert(int expression)void exit(int status)void _exit(int status)int atexit(void (*func)(void))int on_exit(void (*function)(int,void*)…...

力扣刷题 遍历字符串

根据网上的学习 对遍历字符串 学习了一些自己的见解。给一个字符串组成的句子(带空格或标点)&#xff0c;然后对句中单个字符串进行一系列处理的题目 参考链接 1805. 字符串中不同整数的数目 - 力扣&#xff08;LeetCode&#xff09; 模版1 s " "; //这里在最后一…...

深度剖析观察者模式:从理论到实战的Java实现

在软件设计中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09; 是一种高频使用的行为型设计模式&#xff0c;它定义了对象之间一对多的依赖关系&#xff0c;使得当一个对象状态改变时&#xff0c;其所有依赖对象&#xff08;观察者&#xff09;会自动收到通知并…...

Rust学习总结之所有权(一)

不管是计算机的哪种语言&#xff0c;都有内存的管理方式。主流有两种&#xff0c;一是以C为代表的由开发者来决定申请和释放内存&#xff0c;二是以Python为代表的通过语言本身的垃圾回收机制来自动管理内存。Rust开辟了第三种方式&#xff0c;通过所有权系统管理内存。 Rust所…...

汇编简介常用语法

为什么要有汇编 因为Cortex-A芯片一上电SP指针还没初始化&#xff0c;C环境还没准备 好&#xff0c;所以肯定不能运行C代码&#xff0c;必须先用汇编语言设置好C环境&#xff0c;比如初始化DDR、设置SP 指针等等&#xff0c;当汇编把C环境设置好了以后才可以运行C代码 GNU语法…...

xtquant库在量化交易中的安装与实战应用

xtquant库在量化交易中的安装与实战应用 技术背景与应用场景 在量化交易领域&#xff0c;xtquant库作为迅投官方开发的Python包&#xff0c;扮演着至关重要的角色。它主要用于与MiniQMT通信&#xff0c;使得开发者能够获取MiniQMT中的数据&#xff0c;并下达交易指令。通过xt…...

ANR学习

一、ANR 概述 ANR 是 Android 系统用于监控应用是否及时响应的关键机制。形象地说&#xff0c;如同设置定时炸弹场景&#xff1a;系统的中控系统&#xff08;system_server 进程&#xff09;启动倒计时&#xff0c;若应用进程在规定时间内未完成特定任务&#xff0c;中控系统将…...

前端知识速记--JS篇:instanceof

前端知识速记–JS篇&#xff1a;instanceof 在JavaScript中&#xff0c;instanceof运算符用于检测一个对象是否是另一个对象的实例。它的基本语法为&#xff1a;obj instanceof Constructor。如果obj是Constructor的实例&#xff0c;它将返回true&#xff0c;否则返回false。这…...

Tcp_socket

Tcp不保证报文完整性&#xff08;面向字节流&#xff09; 所以我们需要在应用层指定协议&#xff0c;确保报文完整性 // {json} -> len\r\n{json}\r\n bool Encode(std::string &message) {if(message.size() 0) return false;std::string package std::to_string(m…...

idea插件开发,如何获取idea设置的系统语言

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/145578160 版本要求 大于 2024.3 错误用法 网上有的说使用&#xff1a;UIUtil com.intellij.util.ui.UIUtil 代码示例&#xf…...

< 自用文儿 > 在 Ubuntu 24 卸载 Docker 应用软件与运行的容器

环境&#xff1a; Host: usw OS: Ubuntu 24.04 TLS 目标: 卸载在运行的 Docker APP。 &#xff08;上运行了一个 container: 可以在线看 WSJ RSS 新闻&#xff0c;都 docker 预装两个网口&#xff0c;今天发现路由表有些看不懂&#xff0c;决定卸载&#xff09; 卸载 Dock…...

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强&#xff0c;智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备&#xff0c;能够实时采集用户的腰部健康数据&#xff0c;如姿势、运动…...

MySQL InnoDB引擎 MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制&#xff0c;是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作&#xff0c;从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...

深入解析 STM32 GPIO:结构、配置与应用实践

理解 GPIO 的工作原理和配置方法是掌握 STM32 开发的基础&#xff0c;后续的外设&#xff08;如定时器、ADC、通信接口&#xff09;都依赖于 GPIO 的正确配置。 目录 一、GPIO 的基本概念 二、GPIO 的主要功能 三、GPIO 的内部结构 四、GPIO 的工作模式 1. 输入模式 2. 输…...

【Elasticsearch】管道聚合

管道聚合就是在已有聚合结果之上在进行聚合&#xff0c;管道聚合是针对于聚合的聚合 在 Elasticsearch 中&#xff0c;管道聚合&#xff08;Pipeline Aggregations&#xff09;是一种特殊的聚合类型&#xff0c;用于对其他聚合的结果进行进一步的计算和处理&#xff0c;而不是直…...

Python的那些事第十八篇:框架与算法应用研究,人工智能与机器学习

人工智能与机器学习&#xff1a;框架与算法应用研究 摘要 本文深入探讨了人工智能与机器学习领域的核心框架和技术&#xff0c;包括TensorFlow、PyTorch和Scikit-learn库。文章首先介绍了TensorFlow和PyTorch的安装与配置方法&#xff0c;详细阐述了它们的基础概念&#xff0c…...

【大数据安全分析】为什么要用大数据技术进行安全分析?

在当今数字化浪潮的推动下,安全运营领域犹如一片广袤且复杂的战场。由于其涵盖范围极为宽泛,为了能更深入、精准地探讨相关内容,将目光聚焦于大数据安全分析方向显得尤为必要。一方面,大数据安全分析在安全运营领域占据着举足轻重的地位;另一方面,倘若自身对该领域较为熟…...

java微服务常用技术

Spring Cloud Alibaba 1 系统架构演进 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。 1.1 单体架构 早期的软件系统通常是基于单体应用架构设计的,也就是将整个系统作为一个单一的、可执行的应用程序来构建和维护…...

【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)

**View和**Widget的区别&#xff1f; **View的实现更底层&#xff0c;**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式&#xff0c;软件设计模式。 M&#xff08;model&#xff09;模型。管理应用程序的核心数据和…...