教你深刻理解Runtime机制

[全网最全]深度解析 runtime:程序阶段、运行时库与系统 在本文中,我们探讨了 runtime 的三个核心含义——程序生命周期中的阶段、运行时库以及运行时系统。通过对这些概念的解析,我们不仅揭示了它们在不同上下文中的具体作用,也帮助读者更好地理解了在编程实践中的实际应用。无论是系统级语言中的运行时库,还是高级语言中的运行时系统,runtime 都扮演着至关重要的角色。它不仅提供了程序执行所需的基础设施,还影响着程序的性能、稳定性和功能。 阅读详情

教你深刻理解Runtime机制

什么是Runtime?

概念

Objective-C是基于C语言加入面向对象特性和消息转发机制的动态语言,这就是说它不仅需要一个编译器,还需要Runtime系统动态的创建类和对象,进行消息发送和转发。关于Runtime概念众说纷纭。理解Runtime,我们从源码开始…. 源码介绍 Runtime在实际开发中,其实就是一组C语言函数。

官方介绍:官方文档

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.

怎么理解这句话呢?尽量将决定放到运行的时候,而不是在编译和链接过程…如图所示
9fLXqO.png

Clang 是什么鬼?

Clang是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器。

官方介绍:官方文档

clang is a C, C++, and Objective-C compiler which encompasses preprocessing, parsing, optimization, code generation, assembly, and linking.

源代码:main.m

//
//  main.m
//  YJDoctor
//
//  Created by YJHou on 2015/10/25.
//  Copyright © 2015年 houmanager@hotmail.com. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSObject *obj = [[NSObject alloc] init];
        NSLog(@"-->%@", obj);
    }
    return 0;
}

编译器:

clang -rewrite-objc main.m

生成了mian.cpp文件,打开查看源码:

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 

        NSObject *obj = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc")), sel_registerName("init"));
        NSLog((NSString *)&__NSConstantStringImpl__var_folders_dr_k2drvnh548q5293brg9wmgzc0000gn_T_main_2a142f_mi_0, obj);
    }
    return 0;
}

似乎看到了Runtime的影子:objc_msgSend、objc_getClass、sel_registerName…

寻找Runtime的来源

打开资源地址:/usr/include/objc 会发现如下文件:

9fX2HU.png

为什么要熟悉掌握Runtime机制?

Runtime 在实际开发中,会经常用到吗?这个答案是肯定的。但是Runtime用的好不好在于理解程度,理解的好代码质量高效实用;用的不好,容易自己造坑。在实际开发中,我并不是推荐大家熟悉灵活的运用底层的东西,而是熟悉知道底层的运行机制。要不已经封装好看又好用的API干啥使。

Runtime 具体都干啥使用?

比如:动态添加属性、动态添加方法、方法交换、字典模型转换

面试经历: 曾经一次面试,面试官说类别能不能设置属性?咋一听,条件反射类别还能设置属性,什么鬼,后来一想面试官问的是怎么给类别添加属性吧,用词准确很重要,添加和设置概念是不同的。面试官马上更正是添加不是设置。

深刻理解Runtime的底层原理是什么样子的?

首先了解Runtime的数据结构

打开runtime.h会看到数据结构如图所示:

9hCZwt.png

  • id : typedef struct objc_object *id;
  • SEL : typedef struct objc_selector *SEL;
  • Class : Class 也有一个 isa 指针,指向其所属的元类(meta)。
  • super_class:指向其超类。
  • name:是类名。
  • version:是类的版本信息。
  • info:是类的详情。
  • instance_size:是该类的实例对象的大小。
  • ivars:指向该类的成员变量列表。
  • methodLists:指向该类的实例方法列表,它将方法选择器和方法实现地址联系起来。methodLists 是指向 ·objc_method_list 指针的指针,也就是说可以动态修改
  • methodLists 的值来添加成员方法,这也是 Category 实现的原理,同样解释了 Category 不能添加属性的原因。
  • cache:Runtime 系统会把被调用的方法存到 cache 中(理论上讲一个方法如果被调用,那么它有可能今后还会被调用),下次查找的时候效率更高。
  • protocols:指向该类的协议列表(对象方法列表的扩展)。

理解底层原理要从这三张图说起:

Messaging 官方介绍

9fz4Z6.png

  1. 刚开始clang mian.m文件可以看出,Runtime System 会将方法调用转化为消息发送(objc_msgSend), 并把方法的调用者和方法选择器当做参数传递。
  2. 此时,方法调用者会通过isa指针来找到其所属的类,然后在cache或者methodLists中查找该方法,如果能找到就跳到对应的方法(IMP)中执行。
  3. 如果在类中没有找到该方法,会检查本类是否有动态加载的方法来处理该消息,如果还是没有,通过super_class网上一级父类查找, 如果一直到NSObject都没找到该方法的话,这种情况,就该消息转发上场了。
  4. 从数据结构中看到,methodLists 指向该类的实例方法列表,那么类方法在哪里?类方法存储在元类中,Class通过isa指针即可找到所属的元类。

Dynamic Method Resolution 官方介绍

9h9cRg.png

从有图可以看出,ObjC 类本身同时也是一个对象,为了处理类和对象的关系,runtime 库创建了一种叫做元类 (Meta Class) 的东西,类对象所属类型就叫做元类,它用来表述类对象本身所具备的元数据。类方法就定义于此处,因为这些方法可以理解成类对象的实例方法。

每个类仅有一个类对象,而每个类对象仅有一个与之相关的元类。当你发出一个类似 [NSObject alloc] 的消息时,你事实上是把这个消息发给了一个类对象 (Class Object) ,这个类对象必须是一个元类的实例,而这个元类同时也是一个根元类 (root meta class) 的实例。所有的元类最终都指向根元类为其超类。所有的元类的方法列表都有能够响应消息的类方法。所以当 [NSObject alloc] 这条消息发给类对象的时候,objc_msgSend() 会去它的元类里面去查找能够响应消息的方法,如果找到了,然后对这个类对象执行方法调用。

在Runtime System没有在本类的method_lists没有找到匹配的实现方法时,我们可以动态的添加一个方法,这是开始进行消息转发(messaging forward)前的第一阶段,例如我们用@dynamic关键字在类的实现文件中修饰一个属性:这表明我们会为这个属性动态提供存取方法,编译器不会默认为我们生成setPropertyName:和propertyName方法,而需要我们动态提供。

同样我们可以通过分别重载resolveInstanceMethod:和resolveClassMethod:方法分别添加实例方法实现和类方法实现。因为当 Runtime 系统在Cache和方法分发表中来给程序员一次动态添加方法实现的机会。我们需要用class_addMethod函数完成向特定类添加特定方法实现的操作:

Message Forwarding 官方介绍

9h9TiT.jpg

消息转发分为两大阶段。

  • 第一阶段先征询接收者,所属的类,看其是否能动态添加方法,以处理当前这个“未知的选择子”,这叫做“动态方法解析”。
  • 第二阶段涉及“完整的消息转发机制(full forwarding mechanism)”如果运行期系统已经执行完第一阶段,此时,运行期系统会请求我接收者以其它手段来处理消息。可以细分3小步。

    1.首先查找有没有replacement receiver进行处理。若无;

    2.运行期系统把Selector相关信息封装到NSInvocation对象中;

    3.再给一次机会,若依旧未处理则让NSObject调用doNotReconizeSelector:

具体看代码所示:

9hAfL4.md.png

9hA4eJ.png

由此我们可以看到,object_getClass返回的其实是class的metaClass,即Class这个类对象的类,这个概念有点绕。梳理一下:Person这么一个类(0x1000f53c8),它的isa指针指向其元类(地址0x1000f53f0),这个元类的isa指针指向基类NSObject的元类,即根元类(0x1a7919ec8),再递进一层可以发现,根元类的isa指针指向自己,这样就形成了一个完整的闭环。

另外objc_getClass 是什么鬼?

9hECfP.md.png

9hEFl8.png

由此可知objc_getClass方法只是单纯地返回了Class,而非isa指针指向的Class。

Runtime的应用场景有什么?

  • 实现第一个场景:跟踪程序每个ViewController展示给用户的次数,可以通过Method Swizzling替换ViewDidAppear初始方法。创建一个UIViewController的分类,重写自定义的ViewDidAppear方法,并在其+load方法中实现ViewDidAppear方法的交换
  • 开发中常需要在不改变某个类的前提下为其添加一个新的属性,尤其是为系统的类添加新的属性,这个时候就可以利用Runtime的关联对象(Associated Objects)来为分类添加新的属性了
  • 三实现字典的模型和自动转换,优秀的JSON转模型第三方库JSONModel、YYModel等都利用runtime对属性进行获取,赋值等操作,要比KVC进行模型转换更加强大,更有效率。阅读YYModel的源码可以看出,YY大神对NSObject的内容进行了又一次封装,添加了许多描述内容。其中YYClassInfo是对Class进行了再次封装,而YYClassIvarInfo、YYClassMethodInfo、YYClPropertyInfo分别是对Class的Ivar、Method和property进行了封装和描述。在提取Class的相关信息时都运用了Runtime。
  • JSPatch替换已有的OC方法实行,具体内容请参看相关文档。
Agent Runtime 层正在消亡:Session、Harness 与 Sandbox 的重构逻辑 Agent runtime 是支撑大模型智能体执行的核心基础设施层,其本质是会话管理、工具调度与安全隔离的三位一体。随着 Anthropic、AWS Bedrock 和 Google Vertex 等平台将 Session 事件化、Harness 无状态化、Sandbox 微虚拟机化,runtime 的技术差异正快速收敛为标准化抽象。这一演进并非性能竞赛,而是工程确定性、审计合规性与总持有成本(TCO)驱动的必然选择。当 sandbox 启动延迟进入百毫秒级、credential 注入遵循 strict f 阅读详情

相关推荐

OpenHarmony端侧AI推理实践:ONNX Runtime与大模型部署

端侧AI推理是移动计算领域的重要技术方向,通过在设备本地执行AI模型,既能保障数据隐私又能实现低延迟响应。其核心原理是利用ONNX等开放模型格式和运行时框架,将训练好的模型部署到资源受限的终端设备。在OpenHarmony生态中,通过N-API桥接和C++原生层优化,可以显著提升推理性能。典型应用场景包括移动端图像分类、目标检测以及大语言模型本地化部署。本文以Qwen2-0.5B模型为例,展示了如何通过模型量化和线程安全设计,在ARM架构开发板上实现流式对话功能,为开发者提供了端侧AI落地的工程实践参考。

weixin_34258838的博客 400

Claude Managed Agents:AI 应用的 runtime 操作系统时刻

AI 代理(Agent)正从单轮对话迈向长时、多步、可审计的生产级服务,其核心瓶颈已从模型能力转向运行时(runtime)稳定性与可观测性。session 作为持久化事件日志、harness 作为无状态执行器、sandbox 作为凭证隔离容器,共同构成新一代 AI 运行环境的基础设施三要素。这种设计将易失的上下文状态升级为耐久可查的业务事件流,显著提升故障定位、安全合规与成本治理能力。尤其在销售复盘、客服工单、法务摘要等需强溯源、高可靠、跨系统协同的场景中,Managed Agents 提供了比 LangC

weixin_30411819的博客 559

Agent Runtime 范式革命:会话即事件日志的工程实践

Agent 运行时(Runtime)是大模型落地生产的核心基础设施,其本质是协调模型推理、工具调用与状态管理的执行层。传统方案将状态耦合于模型上下文,导致信息丢失、调试困难、容错缺失;而新一代架构如 Anthropic Managed Agents 提出‘会话即事件日志(Session-as-Event-Log)’原理,通过 Harness(无状态执行器)、Session(持久化时序日志)与 Sandbox(隔离沙箱)三层解耦,实现状态可审计、执行可恢复、凭证最小化。该设计显著提升长时任务可靠性与企业级可观

weixin_30522183的博客 361

Runtime运行时机制

RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。

wownbafifa的博客 568

Agent Runtime 范式革命:Session 作为持久化事件日志

AI 智能体(Agent)的本质是状态驱动的长期任务执行系统,其核心挑战在于可靠的状态管理与可追溯的行为控制。传统方案将状态硬塞进模型上下文,导致记忆覆盖、调试黑盒、审计缺失等工程顽疾;而现代 Agent Runtime 的演进方向,正从‘上下文即状态’转向‘Session 即事件日志’——通过持久化、只追加、带时间戳的结构化事件流,实现状态解耦、行为可观测与故障可回溯。这一范式不仅支撑长时会话、跨工具协同与企业级安全沙箱,更成为 Trace 分析、Governance 策略与垂直行业 Agent 市场落地

frank1998819 718

AI代理Runtime层革命:会话即事件日志的工程实践

AI代理已从Demo走向生产,其核心瓶颈不再是模型能力,而是运行时(Runtime)状态管理。传统架构将对话历史寄生在模型上下文内,导致状态易丢失、不可审计、难以运维。Anthropic Managed Agents提出的‘会话即事件日志’范式,通过持久化、不可变、结构化的事件流,实现会话可追溯、可重放、可监控,本质是将AI代理的执行过程升格为可审计的业务操作。该设计直击生产环境中的记忆滑出、调试黑盒、安全越权等高频痛点,为客服机器人、财务对账、代码审查等垂直场景提供稳定可靠的基础设施支撑。

weixin_30480075的博客 382

[linux]基于Ubuntu24.04原内核6.8.0升级到6.9.0

2、编译报错,在编译的过程碰到编译失败,不会像原来老的内核版本会报哪个文件哪行出问题,直接什么也没有,看不见(估计是方法不对),这个问题有点困扰,我直接apt update把内核升级,后边乱搞一通,不知怎么的这个问题又好了。3、机器性能不太好,编译可能比较耗时,一般是开始编译,然后跑出去搞其他事,或者看视频等等。1、编译的时候缺库,一般根据出错的原因百度或者其他搜索解决,这种问题容易些;

5747

Agent Runtime 正在 commoditize:从托管沙箱到 Trace 与治理

Agent 运行时(agent runtime)是支撑智能体执行、状态管理与工具调用的基础层,其核心原理在于将模型上下文之外的状态持久化、执行环境隔离化、凭证访问最小化。随着 Anthropic Managed Agents、AWS AgentCore 和 Google Vertex Agent Builder 等产品成熟,该层正快速走向标准化与免费化,技术价值密度持续下降。其真正的工程意义已转向支撑上层能力:可审计的 trace 存储、企业级策略治理(Governance & Policy)、以及垂直场景

chikuai9995的博客 373

Runtime(运行时)是什么意思

什么是 runtime 在计算机领域中,经常会接触到 runtime 这个概念,那么 runtime 究竟是什么东西? runtime 描述了程序运行时候执行的软件/指令, 在每种语言有着不同的实现。可大可小,在 C 中,runtime 是库代码, 等同于 C runtime library,一系列 C 程序运行所需的函数,在 Java 中,runtime 还提供了 Java 程序运行所需的虚拟机等。 总而言之,runtime 是一个通用抽象的术语,指的是计算机程序运行的时候所需要的一切代码库,框架,平台等

qq_41854911的博客 2万+

通义千问Agent Runtime:企业级智能体开发新范式

智能体(Agent)作为大模型落地业务的核心载体,正从概念验证迈向规模化生产。其本质是融合工具调用、状态管理与多跳推理的运行时系统,技术价值在于降低AI与业务系统的集成门槛,提升响应韧性与可观测性。典型应用场景覆盖智能客服、售后归因、销售辅助等需跨系统协同的业务流。通义千问Agent Runtime并非LangChain封装,而是面向企业生产环境设计的声明式框架,支持OpenAPI契约驱动、显式状态图编排与可视化调试,显著缩短交付周期并增强运维可控性。本文聚焦其Runtime架构原理与低门槛集成实践。

张 作强 BLOG 502

MST-GAT: Enhancing Anomaly Detection in Multimodal Time Series with Intra- and Inter-Modal Attention

本文深入解析了MST-GAT模型,这是一种通过模态内与模态间注意力机制增强多模态时间序列异常检测的新方法。它通过构建图结构显式建模传感器间的复杂时空依赖,并结合时间卷积网络与联合优化策略,有效降低了传统方法中常见的误报与漏报问题,在工业监控等场景中展现出卓越性能。

weixin_29079671的博客 150

Runtime详解,一文带你打通Java Runtime类及其相关知识。

本文将带你详细了解java Runtime类以及其相关知识点,帮你构建完整的知识体系,并且标注了作者在使用时遇到的一些坑。

koveerKV的博客 5934

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 536

深刻理解Objective-C Runtime

当人们初学 Cocoa/Objective-C 时,Objective-C Runtime 是被忽略的特性之一。原因是 Objective-C(这门语言)很容易在几小时内就熟悉,新学 Cocoa 的人花费他们大部分的时间学习 Cocoa 框架和适应它是如何工作的。然而每个人至少应该知道一些 runtime 的工作细节,需要比知道编译器会把 [target doMethodWith:var1];  

hello_world_csdn的博客 240

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 767

fastjson1.2.83反序列化漏洞

【代码】fastjson1.2.83反序列化漏洞。

Coder的博客 1万+

AI Agent Runtime:从沙箱到事件日志的生产级架构演进

AI Agent 不再是简单调用大模型的脚本,而是具备状态、安全与可审计能力的长期运行系统。其核心在于 runtime 层——即承载工具调用、会话管理、凭证隔离与故障恢复的执行环境。随着 Anthropic Managed Agents、AWS Bedrock AgentCore 等产品成熟,‘session as durable event log’正成为生产级 agent 的事实标准,它将传统 context-based 推理升级为可追溯、可重放、可合规的事件驱动范式。该架构显著提升金融风控、保险理赔、

398

SAP期初库存导入 (1)

LSMW

IT养家 7191

函数恢复的秘密:golang_loader_assist如何定位runtime_morestack并还原上千个Go函数

> 把Go程序拖进IDA Pro,函数窗口里却只有寥寥几个`sub_XXXX`,真正的业务逻辑全部"隐身"?这几乎是每个Go逆向新手都会撞上的墙。开源工具 **golang_loader_assist** 正是为此而生:它是一份专为IDA Pro打造的Go二进制逆向辅助脚本,核心使命就是**定位runtime_morestack、回溯交叉引用还原被隐藏的函数边界,并借助符号表一次性还原上千个Go函

gitblog_00109的博客 736

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8289

避坑指南!YOLO26模型导出/推理常见问题,99%的开发者都踩过

版本锁定:Ultralytics=8.4.2、OpenVINO=2024.0.0、Python=3.10,版本不一致是80%问题的根源;参数对齐:训练/导出/推理的imgsz、归一化、坐标映射必须完全一致,差一步就出错;算子统一:避免自定义算子,优先用YOLO26原生算子(C3k2/PSABlock),确保推理引擎兼容;分步验证:导出后先校验ONNX/IR模型→单图片推理→RTSP流推理→72小时稳定性测试,一步过易踩坑;工业级测试。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 510

AI Agent Runtime:从Context寄生到Session事件流的范式革命

AI Agent 不再是简单调用大模型的脚本,而是一个具备状态管理、安全沙箱与可审计生命周期的运行时系统。其核心原理在于解耦模型推理与会话状态,以结构化事件流(Event-Log)替代脆弱的 context 堆叠,从而解决 silent hallucination、context overflow 和不可恢复失败等生产级痛点。该架构带来工程稳定性、弹性伸缩与凭证隔离等技术价值,广泛应用于保险理赔自动化、销售线索跟进、财务对账等高可靠性场景。Anthropic Managed Agents 正是以此 Sess

shikun520的专栏 467

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深刻理解Spring声明式事务

问题引入 Spring中事务传播有哪几种,分别是怎样的? 理解注解事务的自动配置? SpringBoot启动类为什么不需要加@EnableTransactionManagement注解? 声明式事务的实现原理?(待补充)

词不达yi、的技术博客 2942

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

.NET Runtime库组件解析:System.*命名空间深度探索

在日常.NET开发中,我们几乎每天都在使用`System.*`命名空间中的类,但你是否真正理解这些核心组件的工作原理和设计哲学?从基础的集合操作到复杂的并发处理,从文件I/O到网络通信,System命名空间承载着.NET生态系统的基石功能。 本文将带你深入探索.NET Runtime中System.*命名空间的内部实现,通过源码分析、架构设计和最佳实践,帮助你构建对.NET底层机制的深刻理解。 ...

gitblog_00543的博客 1097

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AI代理Runtime重构:事件日志驱动的确定性执行范式

AI代理运行时(Runtime)正从临时上下文管理转向可审计、可恢复、可隔离的基础设施层。其核心原理是将状态外置为只追加的结构化事件日志,执行抽象为无状态函数调度,并通过沙箱级隔离保障安全与弹性。这一范式解决了长流程中记忆丢失、故障不可追溯、凭证泄露等工程痛点,显著提升AI系统在财务审批、客服工单、医疗初筛等关键场景的生产可靠性。它标志着AI开发重心从模型调用转向可观测性、策略治理与垂直业务编排——而事件日志与无状态执行器,正是支撑这一迁移的底层技术基石。

weixin_30394981的博客 441
上一篇: runtime如何实现weak变量的自动置nil?
下一篇: iOS链接跳转到App
Bytesking
博客等级 码龄10年 15粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值