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.mzph.cn/news/824346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++修炼之路之STL_stack,queue和容器适配器

目录 前言 一:SLT中stack和queue的基本使用 1.在官网中对stack和queue的简单介绍 2.数据结构中栈和队列的基本知识和操作 3. STL中stack的接口函数及使用 4.STL中queue的接口函数及使用 二:容器适配器Container 三:使用容器适配器…

springboot Logback 不同环境,配置不同的日志输出路径

1.背景: mac 笔记本开发,日志文件写到/data/logs/下,控制台报出:Failed to create parent directories for [/data/logs/........... 再去手动在命令窗口创建文件夹data,报Read-only file system 2.修改logback-spri…

milvus querynode启动源码分析

querynode启动源码分析 结构体 // QueryNode implements QueryNode grpc server // cmd\components\query_node.go type QueryNode struct {ctx context.Contextsvr *grpcquerynode.Server }// Server is the grpc server of QueryNode. type Server struct {querynode typ…

Android笔记: mkdirs不生效失败

Manifest已经配置权限,代码中也动态获取权限,mkdirs一直返回false File.mkdirs()方法创建文件夹失败 1、动态申请读写权限 <!--SDCard写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--SDCard读权…

Linux安装和使用Android Debug Bridge(ADB)

目录 1、开发环境和工具 2、ADB是什么&#xff1f; 3、安装ADB 3.1、使用包管理器安装 ADB 3.2、手动安装 ADB 4、使用ADB 4.1、连接设备 4.2、执行shell命令 4.3、安装应用程序 4.4、截取屏幕截图 4.5、模拟按键和手势 4.6、上传文件到Android设备 4.7、从Android设备下载文件…

常见的并发编程问题,如死锁、竞态条件、线程不安全、内存可见性问题等,如何在Java中避免这些问题?

死锁&#xff1a;发生在两个或更多线程互相等待对方持有的资源&#xff0c;导致所有的线程都无法进行下去。避免死锁的一个常见方法是遵循资源顺序访问&#xff0c;将系统中的资源排序&#xff0c;并约定每个线程都按序请求资源。 竞态条件&#xff1a;两个或更多线程同时访问…

BGP边界网关路由实验(华为)

一&#xff0c;技术简介 BGP&#xff08;边界网关路由协议&#xff09;是一种自治系统&#xff08;AS&#xff09;间的协议&#xff0c;主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合&#xff0c;这些设备可以在一个共同的管理域中协同工…

IaC:实现持续交付和 DevOps 自动化的关键

基础架构即代码&#xff08;IaC&#xff09;和 CI/CD 流水线最初似乎并不匹配。因为它们代表了两种不同的流程。IaC 主要关注基础设施的配置和开发&#xff0c;而 CI/CD 则围绕软件开发、测试和部署。 然而&#xff0c;将 IaC 集成到 CI/CD 流水线中具有多种优势。首先&#xf…

C++从入门到精通——static成员

static成员 前言一、static成员概念例题 二、 static成员的特性特性例题静态成员函数可以调用非静态成员函数吗非静态成员函数可以调用类的静态成员函数吗 前言 一、static成员 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…

Logback:SpringBoot 2.0 整合 Logback (kafaka es)

1. 规范了日志的打印格式 2. 增加了彩色日志输出 3. 支持异步推送kafka 4. 日志文件压缩功能 我们无需关心 Logback 版本&#xff0c;只需关注 Boot 版本即可&#xff0c;Parent 工程自动集成了 Logback。Springboot 本身就可以打印日志&#xff0c;为什么还需要规范…

1 回归:锂电池温度预测top2 代码部分(一) Tabnet

2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 TabNet&#xff1a; 模型也是我在这个比赛一个意外收获&#xff0c;这个模型在比赛之中可用。但是需要GPU资源&#xff0c;否则运行真的是太慢了。后面针对这个模型我会写出如何使用的方法策略。 比赛结束后有与其他两位选手聊天&am…

.net core8 自定义一个中间件

在.NET Core 8中自定义一个中间件&#xff0c;基本步骤与之前的.NET Core版本相似。中间件是ASP.NET Core请求处理管道的一个组件&#xff0c;它们可以在请求处理过程中被调用。下面是如何创建和使用一个自定义中间件的步骤&#xff1a; 第一步&#xff1a;创建中间件类 创建…

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景&#xff1a; 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程&#xff0c;没有搞定&#xff0c;于是写下避坑之作。 服务器&#xff1a;腾讯云轻量应用服务器 操作系统&#xff1a; Windows Server 2022 DataCenter 64bit CN apache…

李沐45_SSD实现——自学笔记

主体思路&#xff1a; 1.生成一堆锚框 2.根据真实标签为每个锚框打标(类别、偏移、mask) 3.模型为每个锚框做一个预测(类别、偏移) 4.计算上述二者的差异损失&#xff0c;以更新模型weights 先读取一张图像。 它的高度和宽度分别为561和728像素。 %matplotlib inline import …

Photoshop 2024 (ps) v25.6中文 强大的图像处理软件 mac/win

Photoshop 2024 for Mac是一款强大的图像处理软件&#xff0c;专为Mac用户设计。它继承了Adobe Photoshop一贯的优秀功能&#xff0c;并进一步提升了性能和稳定性。 Mac版Photoshop 2024 (ps)v25.6中文激活版下载 win版Photoshop 2024 (ps)v25.6直装版下载 无论是专业的设计师还…

EI Scopus双检索 | 2024年清洁能源与智能电网国际会议(CCESG 2024)

会议简介 Brief Introduction 2024年清洁能源与智能电网国际会议(CCESG 2024) 会议时间&#xff1a;2024年 11月27-29日 召开地点&#xff1a;澳大利亚悉尼 大会官网&#xff1a;CCESG 2024-2024 International Joint Conference on Clean Energy and Smart Grid 由CoreShare科…

m4p转换mp3格式怎么转?3个Mac端应用~

M4P文件格式的诞生伴随着苹果公司引入FairPlay版权管理系统&#xff0c;该系统旨在保护音频的内容。M4P因此而生&#xff0c;成为受到FairPlay系统保护的音频格式&#xff0c;常见于苹果设备的iTunes等平台。 MP3文件格式的多个优点 MP3格式的优点显而易见。首先&#xff0c;其…

【flink报错】flink cdc无主键时的操作

文章目录 一. 报错二. 解决 一. 报错 “org.apache.flink.table.api.validationexception: ‘scan.incremental.snapshot.chunk.key-column’ must be set when the table doesn’t have primary keys” 报错提示当表没有主键时&#xff0c;必须设置 ‘scan.incremental.snapsh…

WPF: XAML语法规范详解

WPF&#xff08;Windows Presentation Foundation&#xff09;是.NET框架的一个组成部分&#xff0c;用于构建桌面应用程序的用户界面。XAML&#xff08;Extensible Application Markup Language&#xff09;是一种基于XML的标记语言&#xff0c;用于定义WPF应用程序的界面和逻…

【vim】折叠代码

目录 简介操作创建折叠删除折叠打开或关闭折叠在折叠间移动简介 Vim编辑器中可以使用 foldmethod 选项设置折叠方法。 将 foldmethod 设置为 manual 以外的值时,将删除所有折叠并创建新折叠。切换到 manual 方法不会删除现有的折叠。由此可以先用自动定义折叠,然后手动更改它…