Objective-C Runtime初探(什么是runtime)

一直认为Runtime是一个高深莫测的东西,今天开始正式学习一下什么是Runtime,来揭开它的神秘面纱。

介绍

Objective-C是一门动态语言,它将编译时和链接时的事情推迟到运行时来处理。它可以动态的完成任务。这意味着该语言不仅需要编译器,还需要运行时系统来执行编译的代码。运行时充当了Objective-C的一种操作系统,这就是为什么这个语言可以正常的工作。

下边将介绍NSObject类以及Objective-C如何与runtime进行交互。特别是,它检查了运行时动态加载新类,并且将消息转发给其他的对象。它还提供了有关如何在程序运行时查找有关对象的信息。

阅读此文档你可以了解到Objective-C在运行时系统如何工作。通常情况下,你并不需要知道和理解这些,就可以编写一个app。

版本和平台

在不同的平台有不同版本的Objective-Cruntime.

Objective-C有两个版本modernlegacy。在Objective-C 2.0引入了modern版本,并包含了很多新的功能。Objective-C 1运行时参考中描述了legacy运行时的编程接口; Objective-C Runtime Reference. 参考中描述了现代版运行时的编程接口。在iPhone App和64位的Mac OS X 10.5及以上系统上使用的是modern版本,其他是的legacy版本,我们现在没必要再管legacy了。

值得注意的是实例变量在modern版本中是non-fragile

  • legacy版本中,如果要更改实例变量的布局,则必须重新编译从其继承的类
  • modern版本中,如果要更改实例变量的布局,则不必重新编译从其继承的类

与runtime进行交互

Objective-C程序与运行时系统在三个不同的层次上进行交互:通过Objective-C源代码; 通过Foundation框架中NSObject类中定义的方法以及通过对Runtime 库函数的直接调用。

通过 Objective-C 源代码

在大多是情况下,我们只需要编写和编译Objective-C的源代码。runtime系统自动的在幕后运行并把我们编写的源代码在编译阶段转换成运行时的代码,在运行时确定对应的数据结构和调用具体哪个方法。

编译包含Objective-C类和方法的代码时,编译器将创建实现该语言动态特性的数据结构和函数调用。数据结构通过classcategory定义以及protocol声明来获取信息,他们包含class和协议对象以及selector实例变量以及其他信息,runtime中最终的就是发送消息的功能,它由源代码消息表达式调用。

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

Cocoa中绝大多数对象都是NSObject的子类,所以大多数的对象都继承了它定义的方法。(值得注意的是NSProxy类,参见Message Forwarding 消息转发了解更多信息)。因此,它的方法简历行为是每一个实例和每个类对象固有的。但是在少数情况下,NSObject只是定义了一个模板,它并没有提供所有必要的代码。

例如,NSObject类定义了一个description实例方法,它返回一个描述类内容的字符串。这主要用于调试GDB print-object命令打印从此方法返回的字符串。NSObject这个方法的实现不知道这个类包含了什么,所以它返回一个对象名字和地址的字符串。NSObject子类可以实现这个方法来返回更详细的信息。例如,NSArray返回它包含的对象的描述列表。

有的NSObject方法只是查询运行时的信息。这些方法允许对象进行自省。这样的方法是类方法,该方法要求对象识别自己是哪个类。isKindOfClass:isMemberOfClass:它来测试对象在继承层次结构中的位置。respondsToSelector:它表示一个对象是否可以接受一个特定的消息;conformsToProtocol他表示一个对象是否要实现特定协议中定义的方法;methodForSelector:它提供了一个方法实现的地址。像这些方法给了一个对象自省的能力。

自省是对象的固有能力,即程序运行时,对象可根据请求对外透露自身基本特性。 您可以给对象发送某种消息,向其询问与它自身相关的问题,对象在Objective-C 运行时将会向您提供答案。自省是很重要的编码工具,它可以让程序变得更加高效健壮.

通过对 Runtime 库函数的直接调用

运行时系统是一个动态共享库,它包含了一个公共的接口,它包含在目录/usr/include/objc中的头文件中的一组函数和数据结构。在Objective-C编程时我不需要用这些,但是有些运行时的功能还是很有用的,关于库函数可以在Objective-C Runtime Reference中查看Runtime的详细文档。

文章如有错误希望大家指出,共同学习,共同进步。

转载于:https://juejin.im/post/5a531b2df265da3e484baaba

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值