官方文档:
objective - c语言尽可能决定许多推迟时间运行时编译时间和链接。只要有可能,它动态做。这意味着语言需要的不仅仅是一个编译器,但也一个运行时系统来执行编译后的代码。运行时系统作为一种操作系统的objective - c语言;以便使这门语言运行起来。本文着眼于NSObject类和objective - c程序如何与运行时系统交互。特别是,它检查在运行时动态加载新类的范例,并将消息转发给其他对象。当您的程序正在运行,它还提供了关于如何找到信息对象的信息。你应该阅读本文档了解objective - c运行时系统是如何工作的,以及如何利用它。一般来说,你应该没有理由需要知道。
有两个版本的objective - c运行时——“现代”和“传统”。介绍了现代版和objective - c 2.0包含一个新特性。遗留的编程接口版本的运行时在objective - c中描述1运行时参考;
现代版的运行时的编程接口描述在objective - c运行时参考。最值得注意的新特性在现代运行时实例变量是“非脆弱”:
传统的运行时,如果你改变布局一个类的实例变量,您必须重新编译类继承它。在现代运行时,如果你改变的布局实例变量在一个类中,您不必重新编译类继承它。此外,现代运行时支持声明实例变量合成属性(参见宣布属性在objective - c编程语言)。
objective - c程序与运行时交互系统在三个不同的层次:通过objective - c源代码;通过NSObject类中定义的方法的基础框架;并通过直接调用运行时功能。
objective - c源代码:
在大多数情况下,运行时系统自动和幕后工作。你使用它只是通过编写和编译objective - c源代码。当你编译代码包含objective - c的类和方法,编译器创建数据结构和函数调用,实现语言的动态特性。数据结构中捕捉信息类和类定义和在协议声明,其中包括讨论的对象类和协议在objective - c中定义一个类和协议编程语言,以及选择器方法,实例变量模板、净化从源代码和其他信息。主要运行时函数是发送消息,所述消息传递。它调用的源代码消息表达式。
runtime作用:
运行时系统是一个动态共享库和一个公共接口组成的一组函数和数据结构在头文件位于/usr/include/objc.的目录,当你写代码时这些函数允许您使用纯C复制objective - C编译器做什么。其他形式的基础功能导出NSObject类的方法。这些功能可以开发其他接口运行时系统和生产工具,增加开发环境;他们不需要在objective - c编程。然而,一些运行时功能有时可能编写一个objective - c程序时有用。所有这些功能都是记录在objective - c运行时参考。
消息传递(message)
这一章描述了消息表达式转换成objc_msgSend函数调用,以及你如何可以参考方法的名字。然后解释如何利用objc_msgSend,,如果你需要,你可以绕过动态绑定。
objc_msgSend(receiver, selector, arg1, arg2, ...)
消息传递函数是动态绑定所需的一切:
它首先发现的过程(方法实现)选择器。因为相同的方法可以实现不同的单独的类,精确的过程,它查找取决于接收器的类。
然后调用程序,通过它接收对象(一个指向它的数据),以及任何指定的参数的方法。最后,它的返回值传递过程的返回值。
注:编译器生成调用消息传递功能。你不应该直接调用在您编写的代码。
消息传递的关键在于编译器为每个类和对象构建的结构。每个类结构包括两个基本要素:
一个指向超类。
一个类分派表。这个表,指向专用地址的方法选择器所识别的方法。setOrigin的选择器:与地址相关联的方法(程序实现)setOrigin::,选择器显示方法与地址,等等。创建一个新对象时,内存分配,和它的实例变量初始化。首先在对象的变量是一个指针指向它的类结构。这个指针,称为isa,给出了类和对象访问,通过类的所有类继承。
当一个消息发送到一个对象,消息传递函数是对象的isa指针的类结构看起来方法分派表中选择器。如果找不到选择器,objc_msgSend遵循指向父类的指针,并试图找到分派表的选择器。连续失败导致objc_msgSend攀爬类的层次结构,直到它到达NSObject类。一旦定位选择器,表中输入的函数调用方法并将其传递接收对象的数据结构。选择这个方式方法实现在运行时,在面向对象编程的行话,方法是动态绑定到消息。加速消息传递过程中,运行时系统使用缓存选择器和地址的方法。有一个为每个类单独的缓存,它可以包含继承的方法以及方法的选择器中定义的类。之前搜索调度表,收到的消息传递程序首先检查缓存对象的类(在理论,一种方法是使用一次可能会再次使用)。如果选择器的方法是在缓存中,消息传递是仅略低于一个函数调用。一旦一个程序被运行足够长的时间来“热身”其缓存,几乎所有它发送的消息找到缓存的方法。缓存生长在程序运行时动态地适应新的消息。
当objc_msgSend发现程序实现方法,它调用过程中所有的参数并将其传递消息。它还通过过程两个隐藏的参数:
The receiving object
The selector for the method
网友评论