?
前言
?
OC编程和runtime系统的相互作用,可以分三个不同的标准:
- 通过OC代码。
- 通过在Foundation framework 的 NSObject类中定义方法。
- 通过直接调用runtime 函数。
?
OC代码
?
这是最重要的一部分,runtime 系统在该场景背后自动运行。我们仅仅通过写和编译OC代码就可以使用runtime系统。
当编译包含OC类和方法的代码时,编译器就会创建数据结构和(实现了语言动态特征)函数。数据结构能够捕获有Class和category以及protocol中声明的信息;它们包含了Class和Protocol(在Objective-C Programming Language 中定义的Class和Protocol,还有方法selectors、实例变量以及其他从源码中提取到的信息)。主要的runtime功能就是发送消息,参见Messaging,它也会被OC代码消息表达式调用。
?
NSObject Methods
?
许多Cocoa种的对象都是NSObject类的子类,因此许多对象继承了它定义的方法。(NSProxy类是个例外,更多信息参见Message Forwarding。)因此它的方法建立了行为(对每个实例和类对象来说都是已经存在的方法实现)。少数情况下,NSObject类只定义了应该如何做的方法模板,它自身不提供所有的必须的代码。
例如,NSObject类定义了description实例方法,该方法用于返回一个用于面熟类内容的字符串,这主要是用于debugging—GDB print-object命令打印由该方法返回额字符串。NSObject的该方法的实现不知道该类包含什么,因此它返回一个包含了对象的名称和地址的字符串。NSObject的子类能够重写该方法并返回更详细的描述。例如,Foundation的NSArray类返回了一个array包含的所有的对象的列表。
NSObject的一些方法仅仅查询runtime系统获取信息。这些方法使得对象能够执行校验。例如“class”方法,是用来查询对象的类型;isKindOfClass:和isMemberOfClass:,是测试对象在继承层次中的位置;respondsToSelector:,用于校验对象能否接收一个指定的消息;conformsToProtocol:,用于校验是否某个对象声明了指定Protocol中定义的方法的实现;methodForSelector:,用于提供方法实现体的地址。这些对象本身都是校验性的能力的方法。
?
Runtime Functions
?
运行时系统是动态共享库,并且头文件中(文件路径/usr/include/objc)有一系列函数和数据结构接口声明;其中大部分函数允许我们使用基本的C来复制那些编译器的实现(同我们以OC代码编译后的代码)。其他基础功能可以通过NSObject获得。这些功能能够让我们为runtime 系统开发其接口和工具,以便提高开发效率;在使用OC编程时也可以不使用runtime接口。不过,当用OC编写程序时,有些runtime函数功能在某些场合是非常有用的。所有runtime函数声明可参见Objective-C Runtime Reference。
原文地址:https://www.cnblogs.com/zhouyubo/p/8434789.html