核心理念
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:
则返回指定方法实现的地址。