Objective-C Runtime编程指南之与运行时系统进行交互

本文翻译自Interacting with the Runtime

与运行时系统进行交互

Objective-C程序通过三种不同方式与运行时系统进行交互:通过Objective-C代码;通过Foundation框架中定义在NSObject类中的方法;还有通过直接调用运行时的函数。

Objective-C代码

对于绝大多数场景下,运行时系统会自动在幕后工作。你需要做的仅仅是编写和编译Objective-C代码即可。

当你编译包含Objective-C类和方法的代码时,编译器会创建对应的数据结构和方法调用来体现语言的动态性。这些数据结构会捕获到类、分类和协议声明中的相关信息;它们包含着在The Objective-C Programming Language中Defining a Class和Protocols描述的类和协议对象,还有方法选择器、实例变量模板,还有从源代码中提取的其他信息等。最重要的运行时函数就是那个可以发送消息的对象,就像Messaging中描述的一样。它通过源代码消息表达式进行调用。

NSObject的方法

大多数Cocoa中的对象都是NSObject类的子类,因此大多数对象都继承了其中的方法(例外的是NSProxy类;更多信息请查看Message Forwarding)。因此它的方法会表现出继承的实例和类的默认行为。可是,在某些情况下,NSObject类仅仅是定义了某些事如何做的一个模板;它自身并没有提供所有必要的代码。

例如,NSObject类定义了description实例方法来返回描述类内容的字符串。这个主要用于调试过程----GDB对象打印命令打印出此方法返回的字符串。NSObject中此方法的实现并不知道本类包含的内容,因此该方法只返回了包含对象名称和内存地址的字符串。NSObject的子类可以实现此方法来返回更多信息。比如,Foundation的NSArray类会返回其包含的所有对象的描述信息。

一些NSObject中的方法只是向运行时系统查询信息。这些方法允许对象来进行”自省“(即查看自身的某些信息)。比如这些方法中的class方法,它让对象来识别出自身的类;isKindOfClass:isMemberOfClass:,可以检测对象在继承链中的位置;respondsToSelector: 可以判定某对象是否可以接收指定消息;conformsToProtocol: 判定某对象是否声明已经实现了指定协议中的方法(即该类是否遵循了协议);methodForSelector: 提供了方法实现的地址。形如这些方法都给予了对象检查自身的能力。

运行时的函数

运行时系统是一个带有公共接口的动态共享库,其内部由一系列函数和数据结构组成,公共接口定义在 /usr/include/objc 目录的头文件中。这些函数中的许多都允许你使用纯C语言来做那些编译器为Objective-C代码所做的事。其他一些则输出形成了NSObject类的基本功能。这些函数使为运行时系统开发其他接口或者为增强开发环境制作工具成为了可能;因为它们无需使用Objective-C进行编码。可是,一小部分的运行时函数也会在编写Objective-C代码时非常有用。所有这些函数都被记录在了Objective-C Runtime Reference中。

你可能感兴趣的:(Objective-C Runtime编程指南之与运行时系统进行交互)