iOS知识点 --- Runtime

devtools/2024/11/13 8:55:13/

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/devtools/5782.html

相关文章

Swift错误处理

错误与异常的概念: 在Swift中,错误(error)表示程序可能遇到的意外情况,这些情况可能导致程序无法按预期的方式继续执行。错误通常表示由于外部因素或不正确的代码导致的问题。异常是一种特殊类型的错误,表…

第二届 Oceanbase 开发者大会 实录

第二届 Oceanbase 开发者大会 实录 今天很有幸参加了Oceanbase 开发者大会,我是真的我一开始还不知道什么是Oceanbase ,直到我开了会才知道。看来真的需要多参加一些这样活动。 会议议程 我们科普一下什么是Oceanbase OceanBase 是阿里巴巴集团推出…

匿名函数lambda

一、匿名函数的基本语法 lambda 表达式可以看成是一般函数的函数名被略去,返回值使用了一个 -> 的形式表示。唯一与普通函数不同的是增加了捕获列表。[捕获列表](参数列表) -> 返回类型{函数体 }auto Add = [](int a, int b) -> int {return a + b; }; cout <<…

openssl3.2 - exp - 用base64后的字符串作为配置项的值

文章目录 openssl3.2 - exp - 用base64后的字符串作为配置项的值概述笔记配置项的值长度有限制 配置项的值不能是base64之后的直接值&#xff0c;需要处理之后才行。openssl配置项的值并不是所有可见字符都可以例子现在用的base64的类cipher_base64.hcipher_base64.cpp 现在用的…

kafka---topic详解

一、分区与高可用 在Kafka中,事件(events 事件即消息)是以topic的形式进行组织的;同时topic是分区(partitioned)的,这意味着一个topic分布在Kafka broker上的多个“存储桶”(buckets)上。这种数据的分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个…

MySQL、Oracle查看最大连接数和当前连接数

文章目录 1. MySQL2. Oracle 1. MySQL -- 查看最大连接数 show variables like max_connections; select max_connections; -- select * from performance_schema.session_variables where VARIABLE_NAME in (max_connections); -- select * from performance_schema.global…

神经网络进阶学习文章(一)

1.讲解YOLO有关知识 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎 (zhihu.com) 2.目标检测算法综述 目标检测算法综述 - 知乎 (zhihu.com) 3.TensorFlow详解&#xff0c;当然现在用的最多的是Pytorch框架了 谷歌大神带你十分钟看懂TensorFlow - 知乎 (zhihu.co…

富格林:致用查明暗箱黑幕技巧

富格林认为&#xff0c;投资现货黄金对于新手投资者来说是一个很好的选择&#xff0c;但是在进行投资之前需要了解一些基本的技巧和策略用以查明暗箱黑幕。事实上&#xff0c;现货黄金市场充满着丰富的交易机会&#xff0c;以及并存的交易风险&#xff0c;因此投资者要想在这其…