美文网首页MacOS开发 技术集锦iOS&Mac
Interacting with the Runtime(与运行

Interacting with the Runtime(与运行

作者: ADreamClusive | 来源:发表于2018-04-18 10:05 被阅读3次

    本文翻译自苹果官方文档,原文在此,个人能力有限,有翻译不准确的地方,希望各位读者在评论区多多评论,我会对本文不断进行更新完善。

    OC程序可以在三个不同级别上与运行时系统的进行交互:

    通过OC源代码;

    通过Foundation框架中NSObject类中定义的方法;

    通过对运行时函数的直接调用。

    1 OC源代码

    在大多数情况下,运行时系统自动地在后台工作。你仅通过编写和编译OC源代码使用它。

    当编译包含OC类和方法的代码时,编译器创建实现了语言动态特性的数据结构和函数的调用。该数据结构捕获在类、类别和协议声明中发现的信息,包括类和协议对象(discussed in Defining a Class and Protocols inThe Objective-C Programming Language),以及方法选择器、实例变量模板和源代码中提取的其他信息。正如Messaging中描述的,消息发送函数是最重要的运行时函数。它由源代码消息表达式调用。

    2 NSObject方法

    在Cocoa框架中,大多数对象都是NSObject类的子类,因此大多数对象都继承了其所定义的方法。(值得注意的是,NSProxy类是一个例外;通过Message Forwarding获取更多信息。)因此,它的methods建立每个实例和每个类对象固有的行为。然而,在一些情况下,NSObject类只是定义了一个模板来定义如何做一些事情;并没有提供所有必要的代码。

    比如,NSObject类定义了一个名为description的实例方法,此方法返回一个包含类的描述的字符串。这主要用于调试(GDB打印对象命令打印从该方法返回的字符串)。NSObject对于该方法的实现并不知道该类包含哪些内容,所以返回一个包含该对象名称和地址的字符串。NSObject的子类可以实现该方法来返回更多的细节。比如,Foundation框架中的NSArray类,返回一个其所包含的对象的描述列表。

    有些NSObject的方法只是从runtime系统查询信息。这些方法允许对象执行内省。如下一些识别对象所属类的类方法:

    isKindOfClass: 和 isMemberOfClass:方法测试对象在继承层级中的位置;

    respondsToSelector:指示对象是否可以接受特定消息;

    conformsToProtocol:指示对象是否实现在指定协议中定义的方法;

    methodForSelector:提供方法实现部分的地址。

    这些方法赋予了对象自我反省的能力。

    3 Runtime 函数

    运行时系统是一个位于/usr/include/objc目录的动态共享库,其在头文件中包含一个由一组函数和数据结构组成的公共接口。这些函数允许你使用纯C重现编译器对OC代码所做的事情。其他构成功能的基础可以通过NSObject类的方法导出来。这些函数使得开发其他运行时接口和制作增强开发环境的工具成为可能;使用OC进行编码时是不需要这些的。然而,有时一些运行时函数在编写CO程序时是很有用的。所有这些函数在Objective-C Runtime Reference中做了文档说明。

    相关文章

      网友评论

        本文标题:Interacting with the Runtime(与运行

        本文链接:https://www.haomeiwen.com/subject/wotvkftx.html