Objective-C 运行时编程指南 之 Interacting with the Runtime

来源:互联网 发布:英文原版书推荐 知乎 编辑:程序博客网 时间:2024/06/06 18:06

Objective-C程序与运行时系统在三个明显不同的层次进行交互:通过Objective-C源代码;通过定义在Foundation框架里的 NSObject 类中的方法;通过直接调用运行时方法。

2.1 Objective-C Source Code Objective-C源码

在大多数情况下,运行时系统都在幕后自动工作。你仅通过撰写和编译Objective-C源代码使用到它。

当你编译包含Objective-C类和方法的代码时,编译器创建数据结构和方法调用,实现语言的动态特性。数据结构捕获的相关信息可以在类和类别定义及协议声明中找到;在《The Objective-C Programming Language》 的《Defining a Class and Protocols》一章中论述了类和协议对象,以及方法选择器、实例变量模板和其他从源码中提取的信息。最重要的运行时方法是发送消息,称为Messaging。它被源码消息表达式引用。

2.2 NSObject Methods NSObject方法

Cocoa中大部分对象都是 NSObject 类的子类,因此大部分对象继承了它定义的方法。(值得关注的例外是 NSProxy 类;更多信息参见Message Forwarding章节。)所以它的方法确立起了每个实例和每个类对象的内在行为。但是,在少数情况下,NSObject 类只是定义了某些事情应该如何做的模板;它并没有提供它所需要的所有代码。

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

某些 NSObject 方法简单的向运行时系统查询信息。这些方法允许对象做出反馈。这些方法的例子是 class 方法,会让对象定义自己的类;isKindOfClass:isMemberOfClass: ,这两个方法可以测试对象在继承层级中的位置;respondsToSelector: ,这个方法可以指出一个对象是否可以接受一个特定的消息;conformsToProtocol: ,这个方法可以指出一个对象是否声明实现了某个特殊协议定义的方法; methodForSelector: ,这个方法提供了某个方法实现的地址。像这些方法给予对象内省其自身的能力。

2.3 Runtime Functions Runtime方法

运行时系统是一个带有公共接口的动态共享库,由一系列函数和数据结构组成,头文件放置在 /usr/include/objc 目录下。这些方法中许多允许你使用纯C语言重新获得在你编写Objective-C代码时编译器完成的工作。其他的方法成为了通过NSObject类方法出口的功能的基础。这些函数使得为运行时系统开发其他接口和制作增加开发环境的工具成为可能;而在用Objective-C编程时并不需要它们。但是,也有少数运行时方法可能在写Objective-C程序时偶尔有用。所有的这些方法都写在了《Objective-C Runtime Reference》之中。

0 0