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 _运行时参考中。