[OC Runtime编程指南_翻译]三、与运行时交互

简介: [OC Runtime编程指南_翻译]三、与运行时交互

Objective-C程序在三个不同的层次与运行时系统交互:通过Objective-C源码;通过在基础框架的NSObject类中定义的方法;通过直接调用运行时函数


Objective-C 源码


在大多数情况下,运行时系统在后台自动工作。您只需编写和编译Objective-C源代码就可以使用它。


当您编译包含Objective-C类和方法的代码时,编译器将创建实现语言动态特性的数据结构和函数调用。数据结构捕获类和类别定义以及协议声明中的信息;它们包括在用 _Objective-C _编程语言定义类协议时讨论的类和协议对象,以及方法选择器、实例变量模板和从源代码中提取的其他信息。主运行时函数是发送消息的函数,如 消息传递中所述。它由源代码消息表达式调用。


NSObject 方法


Cocoa中的大多数对象都是NSObject类的子类,因此大多数对象都继承它定义的方法。(一个值得注意的例外是NSProxy类;有关更多信息,请参阅 消息转发。)因此,它的方法建立了每个实例和每个类对象固有的行为。然而,在一些情况下,NSObject类只定义了一个模板,用于说明应该如何完成某件事;它本身并没有提供所有必需的代码。


例如,NSObject类定义了一个description实例方法,该方法返回一个描述类内容的字符串。这主要用于调试-GDB print object命令打印从该方法返回的字符串。这个方法的NSObject实现不知道类包含什么,所以它返回一个带有对象名称和地址的字符串。NSObject的子类可以实现此方法以返回更多详细信息。例如,基础类NSArray返回它包含的对象的描述列表。


有些NSObject方法只是查询运行时系统的信息。这些方法允许对象执行自省。此类方法的示例有类方法,它要求对象标识其类;isKindOfClass:和isMemberOfClass:,用于测试对象在继承层次结构中的位置;respondsToSelector:,指示对象是否可以接受特定消息;conformsToProtocol:,它指示对象是否声明实现特定协议中定义的方法;methodForSelector:,它提供方法实现的地址。像这样的方法给对象提供了自我反省的能力。


运行时函数


运行时系统是一个动态共享库,其公共接口由位于目录/usr/include/objc中的头文件中的一组函数和数据结构组成。这些函数中的许多都允许您使用纯C来复制编写Objective-C代码时编译器所做的工作。其他的则是通过NSObject类的方法导出的功能的基础。这些函数使得开发运行时系统的其他接口和生成扩展开发环境的工具成为可能;在Objective-C中编程时不需要它们。但是,在编写Objective-C程序时,一些运行时函数可能会有用。所有这些函数都记录在_Objective-C _运行时参考中。


相关文章
|
1月前
|
存储 Go C语言
如何用Go开发eBPF程序
【2月更文挑战第7天】
|
8月前
|
NoSQL IDE Go
Go 语言源码级调试器 Delve
Go 语言源码级调试器 Delve
51 0
|
8月前
|
存储 Go
Go 语言开源项目使用的函数选项模式
Go 语言开源项目使用的函数选项模式
39 0
|
9月前
|
Go 虚拟化 云计算
如何在 Go 语言开发的宿主程序中嵌入 WebAssembly
如何在 Go 语言开发的宿主程序中嵌入 WebAssembly
|
16天前
|
人工智能 Rust 安全
WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
22 2
|
安全 Java 编译器
如何用 Go 调用 Windows API | 青训营笔记
如何用 Go 调用 Windows API | 青训营笔记
910 0
|
算法 Java Serverless
Go原生插件使用问题全解析
本人在设计和落地基于Go原生插件机制的扩展开发产品时踩到了很多坑,由于这方面相关资料很少,因而借此机会做一个非常粗浅的总结,希望能对大家有所帮助。本文只说问题和解决方案,不读代码。
Go原生插件使用问题全解析
|
存储 算法 JavaScript
Go 语言快速入门指南:第六篇 与数据为舞之映射
在我们学习汉字的时候,发现有一个生僻字的话,我们会使用字典。字典这种数据组织方式就是为了方便查询的操作的,那么 Go 语言中有没有这样的方式来存储数据呢?当然是有,maps。
|
算法 Java 专有云
Go 原生插件使用问题全解析
我在主导设计和落地基于 Go 原生插件机制的扩展能力时遇到了很多问题,鉴于这方面的相关资料很少,因而就有了这个想法来做一个非常粗浅的总结,希望能对大家有所帮助。
Go 原生插件使用问题全解析
|
缓存 编译器 iOS开发
[OC Runtime编程指南_翻译]四、消息传递
本章介绍如何将消息表达式转换为objc_msgSend函数调用,以及如何按名称引用方法。然后解释如何利用objc_msgSend,以及如果需要,如何绕过动态绑定。
102 0
[OC Runtime编程指南_翻译]四、消息传递

相关课程

更多