iOS痛苦runtimeiOS开发

《精通Objective-C》 运行时(Runtime) 阅读笔

2016-01-22  本文已影响1105人  dibadalu

前言

学习iOS开发已经几个月了,越学越觉得Objective-C的水不浅啊。有关这门语言,我还有很多知识点需要恶补。本来还在想要不要去学swift,感觉2016年swift会更火。现在觉得Objective-C都没学好,还想学swift。做梦吧。Swift虽然语法变得简单了,但是同时多了不少特性,相对Objective-C来说,深入学习的坑一点都不浅。
为了打好基础,从图书馆里借了《精通Objective-C》,此书主要讲述Objective-C的运行时环境、Foundation框架等底层知识,我直接跳读了有关运行时系统的3章——第7、8和9章。

个人阅读技术书的步骤是:

这样做的原因是确保自己在忘记部分知识点的时候,通过自己的代码示例和笔记可以快速查漏补缺,不用重新拿起技术书。(ps:最重要的原因是书是从图书馆借的,下次可不一定能借到)

Demo

RuntimeLearningDemo 提取码: 95nu

第7章.运行时系统

问题1 运行时系统的运行方式

当源代码被编译时,编译器(运行时系统的组成部分)会创建数据结构好函数调用语句,使用它们以动态方式将接收器(类/对象)和消息选择器与方法的实现代码对应起来。在执行程序时,运行时系统库(运行时系统的另外一个组成部分)利用这些信息找到并调用适当的方法。

问题2 运行时系统实现对象消息传递的方式

编译器会将[接收器 消息]形式的对象消息,转换为声明中含有方法签名的(ANSI)C函数调用语句。因此,为了生成正确的对象消息传递代码,编译器需要获得选择器值和方法签名。选择器可以从对象消息表达式提取,而方法签名的匹配最好确保拥有不同特征的方法也拥有不同的名称。

问题3 使用动态类型的好处

问题4 NSObject类的API中用于执行对象内省的方法

本章要点

Objective-C运行时系统的特性和关键组件:

第8章.运行时系统的结构

问题1 编译器如何为Objective-C类和对象生成可执行代码,以及它如何实现对象消息

  1. 当编译器解析对象消息(发送消息的表达式),如[接收器 消息],它会生成调用运行时系统库中函数objc_msgSend()的代码。每条消息都是以动态方式处理的。对于源代码中的类和对象来说,编译器创建了执行对象消息操作所需的数据结构。
  2. 当编译器解析含有类定义和对象的Objective-C源代码时,它会生成相应的运行时数据结构。
    Objective-C中的类与运行时系统库中的Class数据类型对应。Class数据类型是指向objc_class标识符的不透明数据类型的指针。
    如typedef struct objc_class *Class
    使用运行时系统库中的函数可以访问Class(即objc_class)数据类型的变量。
    编译器在解析Objective-C对象的源代码时,会生成创建运行时对象类型的可执行代码。

问题2 Objective-C对象和类的运行时数据结构

实际上,所有Objective-C对象和类的运行时类型都是以isa指针开头的。

id运行时数据类型

问题3 Objective-C运行时系统的数据类型和函数

*** 数据类型***

*** 函数***

*** 布尔型常量(YES和NO)***
*** 空值(NULL、nil和Nil)***

问题4 Objective-C运行时系统的函数及其含义

函数 含义
objc_getClass 对象的类定义
class_getSuperClass 类的父类
objc_getMetaClass 对象的元类定义
class_getName 类的名称
class_getVersion 类的版本信息
class_getInstanceeSize 以字节为单位的类尺寸
class_copyIvarList 类的实例变量列表
class_copyMethodList 类的方法列表
class_copyProtocolList 类的协议列表
class_copyPropertyList 类的属性列表

问题5 运行时系统中的消息传递操作

消息传递操作

注意:

总结

问题6 运行时系统库用于实现对象消息传递的设计机制

问题7 运行时系统库中的方法数据类型

方法数据类型

问题8 运行时系统的方法查询和调用机制——虚函数表

虚函数表是一个用于存储IMP类型(Objective-C方法的实现代码)数据的数组。

运行时系统的方法查询逻辑

问题9 dyld

dyld是一种系统服务,用于定位和加载动态库。

问题10 消息分派

objc_msgSend()函数一定会寻找与消息指定的接收器和选择器对应的IMP指针,然后跳转到该指针指向的地址执行此处的代码。完成该操作后,运行时系统就会使用已优化的自定义汇编语言代码分派方法。这段代码有时叫蹦床,作用是找到正确的代码并跳转过去。

问题11 访问类实例方法

问题12 与运行时系统交互

Objective-C程序通过与运行时系统交互实现动态特性。


与运行时系统交互

问题13 NSObject类的运行时方法

运行时系统API是使用C语言编写的,因此,Foundation框架中的NSObject类提供了一系列封装运行时系统API功能的方法,这些运行时方法所提供的功能:

本章要点

介绍运行时系统结构中的关键组成部分,深入理解运行时系统实现面向对象特性和动态功能的方式:

后记

看完3章Runtime的内容,但是还是意味未尽。

Snip20160122_2.png

粗略的翻看了搜索到的文章,感觉还是没有《精通Objective-C》讲的系统且全面,当然如果能耐心去看官方文档,那自然是最好的。网上的大多数文章要么是只是对Runtime某个特性大笔着墨,或者只是对知识点的查漏补缺。要想真正学习Objective-C的底层知识,还是得通过技术书系统的学,然后配合官方文档和WWDC视频补充。
Runtime的学习刚刚开始,剩下只有通过实践和阅读优秀的源码慢慢学习了。

参考文章

*** ibireme大神这两篇文章是通过苹果官方源代码注释并讲解的。 ***
Objective-C 中的类和对象 by ibireme

Objective-C 中的消息与消息转发 by ibireme

Objective-C与Runtime by 春哥

从AOP框架学习iOS Runtime by 林熠 from 阿里巴巴技术协会

Objective-C Runtime 消息机制 - 代码背后发生的事情

让你快速上手Runtime by 峥吖

上一篇下一篇

猜你喜欢

热点阅读