iOS Runtime详解(新手也看得懂)

preview
需积分: 0 0 下载量 162 浏览量 更新于2020-08-26 收藏 358KB PDF 举报
iOS Runtime 是Objective-C编程语言的核心组成部分,它是一个运行时库,负责实现Objective-C的动态特性,如消息传递、动态类型和方法解析等。本文将深入探讨Runtime的基本概念、消息传递机制以及消息转发的过程。 Runtime是Objective-C的基石,它扩展了C语言并引入了Smalltalk式的消息传递。Objective-C的动态特性使得程序在运行时可以改变类的行为、创建新的类和对象,这些都离不开Runtime的支持。Runtime分为“modern”和“legacy”两个版本,现代版本适用于iOS和macOS 10.5以后的64位系统,而旧版本则用于较早的32位系统。 Runtime的核心之一是消息传递。当我们在Objective-C中调用一个方法,如`[obj foo]`,在编译后会转换为`objc_msgSend(obj, @selector(foo))`。Runtime执行消息传递的步骤如下: 1. 通过对象`obj`的`isa`指针找到对应的类。 2. 在类的`method list`中查找方法`foo`。 3. 如果当前类没有找到`foo`,Runtime会递归地在超类中查找。 4. 找到`foo`的实现(IMP)后,执行该方法。 为了提高效率,Runtime使用了缓存(`objc_cache`),将常用方法存储起来,下次调用时可以直接从缓存中获取,无需遍历整个`method list`。 `objc_msgSend`是实现消息传递的关键函数,它接收对象和选择器(SEL)作为参数。在Objective-C中,对象是`objc_object`结构体的实例,类是`objc_class`结构体,方法则是`objc_method_list`中的条目。`objc_class`包含了指向父类的指针、类名、版本信息以及方法列表等。 消息转发机制在找不到对应方法时发挥作用。当一个消息无法在接收者及其祖先类中找到相应的方法实现时,Runtime会启动转发机制,包括两个阶段: 1. 默认消息转发:对象有机会通过实现`-forwardingTargetForSelector:`方法指定另一个对象来处理消息。 2. 完整的消息转发:如果默认转发失败,对象可以通过`-forwardInvocation:`方法处理`NSInvocation`对象,或者自定义消息转发行为,例如动态添加方法或抛出异常。 了解Runtime的这些基础知识对于提升Objective-C的编程技巧至关重要,它可以帮助开发者更好地理解和调试代码,甚至在遇到难题时从系统层面寻找解决方案。熟悉Runtime的API和底层机制,可以让我们编写出更高效、更灵活的Objective-C程序。