OC程序与运行时系统的交互在三个不同层:通过OC源码;通过Foundation框架中的NSObject类定义的方法;和通过直接调用运行时的方法。
OC源码
对于大多数情况下,OC运行时系统自动的在后台运行。你只需编写和编译OC代码就能使用它。
当你编译包含OC类和方法的代码时,编译器创建用来实现语言动态特性的数据结构体和方法调用。数据结构获取类和类定义的信息和协议中定义的信息,包含了在《The Objective-C Programming Language》中对“ Defining a Class and Protocols”谈论的类和协议的对象,以及方法选择,实例变量模版,和其他葱源代码中提取出来的信息。运行时主要的一个功能是发送消息,正如在Messaging 中的描述。它是由源代码的消息表达式调用的。
NSObject方法
Cocoa中大部分的对象都是NSObject类的子类,所以大部分的继承它所定义的方法(值得注意的一个特例是NSProxy类,查看MessageForwarding 获取更多信息) 。因此,它所建立的行为是每一个实例和类对象所固有的。然而,在少数的情况下,NSObject类仅仅定义一个如何做模式的模板,它自己并不提供所有需要的代码。
例如,NSObject类定义了一个返回描述一个类内容的字符串的描述性实例方法。这主要用于调试模式下,使用GBD打印对象命令时,打印该方法返回的字符串。该方法在NSObject的实现中并不知道包含那个类,因此,它返回一个带有该对象的名字和地址的字符串。NSObject的子类可以通过实现该方法返回更多的信息。例如,Foundation类中的NSArray返回其对象所包含的列表的描述。
一些NSObject方法简单的询问运行时系统获取信息。这些方法允许其对象进行自省。这类方法的例子是那些让对象去识别他自己的类的类方法。比如,isKindOfClass和isMemberOfClass,测试一个对象在其继承层次结构中的位置;respondsToSelector,指的是一个对象是否识别给定的方法;conformsToProtocol,指示一个对象是否声明实现了一个特殊协议中定义的方法;methodForSelector,提供方法实现的地址。像这些方法都为对象提供了关于它自己的自省的能力。
运行时方法
运行时系统是一个动态的共享库,包含了一个由一系列函数和数据结构组成的公共接口,其头文件位于路径/usr/include/objc中。在编写OC代码时,其中的一些函数允许你使用平台C语言去复制编译起所做的事情。其他形式依据NSObject类提供的方法进行功能性的传输。这些方法为发展运行时系统的其他接口和生产可以加强开发环境的工具提供了可能。在编写OC代码时,不一定需要它们。然后,在编写OC程序时,一些运行时函数偶尔有可能很有用。这些函数都记录在《Objective-C Runtime Reference》中