Objective-C Runtime I

核心理念

Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。

早期版本和现行版本

Objective-C运行时系统有两个已知版本:早期版本和现行版本。现行版本主要是Objective-C 2.0及与其相关的新特性。

在现行版本中,最显著的新特性就是实例变量是"健壮“(non-fragile)的:

  • 在早期版本中,如果您改变类中实例变量的布局,您必须重新编译该类的所有子类。

  • 在现行版本中,如果您改变类中实例变量的布局,您无需重新编译该类的任何子类。

此外,现行版本支持声明property的变量的统一声明。

平台

iPhone程序和Mac OS X v10.5及以后的系统中的64位程序使用的都是Objective-C运行时系统的现行版本。

其它情况(Mac OS X系统中的32位程序)使用的是早期版本。

Objective-C程序有三种途径和运行时系统交互:通过Objective-C源代码;通过Foundation框架中类NSObject的方法;通过直接调用运行时系统的函数。

通过类NSObject的方法

Cocoa程序中绝大部分类都是NSObject类的子类,所以大部分都继承了NSObject类的方法,因而继承了NSObject的行为。然而,某些情况下,NSObject类仅仅定义了完成某件事情的模板,而没有提供所有需要的代码。

例如,NSObject类定义了description方法,返回该类内容的字符串表示。这主要是用来调试程序——GDB中的print-object方法就是直接打印出该方法返回的字符串。NSObject类中该方法的实现并不知道子类中的内容,所以它只是返回类的名字和对象的地址。NSObject的子类可以重新实现该方法以提供更多的信息。例如,NSArray类改写了该方法来返回NSArray类包含的每个对象的内容。

某些NSObject的方法只是简单地从运行时系统中获得信息,从而允许对象进行一定程度的自我检查。例如,class返回对象的类;isKindOfClass:isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector:检查对象能否响应指定的消息;conformsToProtocol:检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址。