iOS Runtime

Runtime 简介:
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。

与Runtime交互
Objc 从三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架的NSObject类定义的方法,通过对 runtime 函数的直接调用。

Runtime 是什么:
1.运行时(Runtime)是指将数据类型的确定由编译时推迟到了运行时。

2.Runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。

3.平时编写的OC代码,在程序运行过程中,其实最终会转换成Runtime的C语言代码,Runtime是Object-C的幕后工作者。

4.Object-C需要Runtime来创建类和对象,进行消息发送和转发。

特性: 编写的代码具有运行时、动态特性。

Runtime用来干什么?用在哪些地方?
用来干什么 基本作用

1.在程序运行过程中,动态的创建类,动态添加、修改这个类的属性和方法;

2.遍历一个类中所有的成员变量、属性、以及所有方法;

3.消息传递、转发;

4.方法调配;

5.“类对象” NSProxy;

6.KVC、KVO ;

用在哪些地方 Runtime的典型事例

1.给系统分类添加属性、方法;

2.方法交换;

3.获取对象的属性、私有属性;

4.字典转换模型;

5.KVC、KVO;

6.归档(编码、解码);

7.NSClassFromString class<->字符串

8.block;

9.类的自我检测;

10.Aspects(AOP必备,“取缔” baseVC,无侵入埋点)

消息转发机制
当向某个对象发送一条消息时,若该对象的方法列表以及它相应继承链上的方法列表都无法找到以该消息选择子作为key的方法实现时,则会触发消息转发机制。

1.动态方法解析 + (BOOL)resolveInstanceMethod:(SEL)sel;

当接受到未能识别的选择子时,运行时系统会调用该函数用以给对象一次机会来添加相应的方法实现,如果用户在该函数中动态添加了相应方法的实现,则跳转到方法的实现部分,并将该实现存入缓存中,以供下次调用。

2.备用接收者 - (id)forwardingTargetForSelector:(SEL)aSelector;

如果运行时在消息转发的动态方法解析中未找到所调用方法的实现,那么当前接收者还有第二次机会进行未知选择子的处理。这时运行期系统会调用上述方法,并将未知选择子作为参数传入,该方法可以返回一个能处理该选择子的对象,运行时系统会根据返回的对象进行查找,若找到则跳转到相应方法的实现,则消息转发结束。

3.完整的消息转发 - (void)forwardInvocation:(NSInvocation *)anInvocation;

当运行时系统检测到备援接收者中用户未返回能处理相应选择子的对象时,那么来到这一步就要启动完整的消息转发机制了。该方法可以改变消息调用目标,运行时系统根据所改变的调用目标,向调用目标方法列表中查询对应方法的实现并实现跳转,这种方式和备用接收者步的操作非常相似。当然你也可以修改方法的选择子,亦或者向所调用方法中追加一个参数等来跳转到相关方法的实现。

最后,如果消息转发的第3步还未能处理该未知选择子的话,那么最终会调用NSObject类的如下方法用以异常的抛出,表明该选择子最终未能处理。

  • (void)doesNotRecognizeSelector:(SEL)aSelector;

附上完整的消息转发流程图:

欢迎大家指出文中的错误!
也欢迎大家指出文中的不足!

iOS Runtime是一种运行时环境,它是iOS操作系统中的重要组成部分。iOS Runtime为开发者提供了一套动态询问、修改和扩展应用程序行为的机制。 首先,iOS Runtime实现了Objective-C语言的动态特性。Objective-C是一种面向对象的编程语言,它具有动态特性,即在运行时能够动态地修改对象的行为。iOS Runtime允许开发者通过运行时系统对类、对象、方法以及属性进行动态操作。例如,开发者可以在运行时为某个类添加新的方法,也可以通过运行时修改类的实例变量。 其次,iOS Runtime还提供了消息发送机制。在Objective-C中,对象之间的通信是通过消息发送来完成的。iOS Runtime负责将消息转发给正确的接收者,并执行相应的方法。这个过程是动态的,开发者可以在运行时动态改变消息的接收者或方法的实现。这为Objective-C语言带来了很高的灵活性。 此外,iOS Runtime还支持方法的交换与替换。开发者可以通过运行时机制,在运行时将一个方法的实现替换为另一个方法的实现,或者交换两个方法的实现。这对于调试、性能监控和代码扩展都是非常有用的。 总结来说,iOS RuntimeiOS操作系统中实现Objective-C语言特性的核心组件。它提供了动态特性的支持,使开发者能够在运行时动态地修改类、对象和方法的行为,实现更加灵活和可扩展的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值