KVC&KVO&运行时

运行时:要先了解程序运行的三个阶段

1.编译阶段:

编译器LLVM(Low Level Virtual Machine)

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name “LLVM” itself is not an acronym; it is the full name of the project.
LLVM 项目是一个模块化、可重用的编译器、工具链技术的集合。尽管它的名字叫 LLVM,但它与传统虚拟机的关系并不大。

“LLVM”这个名字本身不是一个缩略词; 它的全称是这个项目。
// LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写

LVVM 的作者写了一篇关于什么是 LLVM 的文章,详细的描述了 LLVM 的使用的技术点:LLVM。

简单的说,

LLVM 是一个项目,其作用就是提供一个广泛的工具,可以将任何高级语言的代码编译为任何架构的 CPU 都可以运行的机器代码。

它将整个编译过程分类了三个模块:前端、公用优化器、后端。(这里不要去思考任何关于 web 前端和 service 后端的概念。)

前端:

对目标语言代码进行语法分析,语义分析,生成中间代码。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。我们在开发的过程中,其实 Xcode 也会使用前端工具对你的代码进行分析,并实时的检查出来某些错误。前端是针对特定语言的,如果需要一个新的语言被编译,只需要再写一个针对新语言的前端模块即可。
公用优化器:

将生成的中间文件进行优化,去除冗余代码,进行结构优化。
后端:

后段将优化后的中间代码再次转换,变成汇编语言,并再次进行优化,最后将各个文件代码转换为机器代码并链接。

链接是指将不同代码文件编译后的不同机器代码文件合并成一个可执行文件。

前段(编译我们的文件、三方库文件)、

优化器(删除冗余代码)、

后端(根据CPU架构输出汇编语言,将各个文件代码转换为机器代码并链接,合并成一个可执行文件(二进制),动态库会生成两个可执行文件,静态库只会生成一个可执行文件)

故静态库是在链接的时候就通目标程序绑在一起,生成一个主执行文件。

动态库会生成单独的一个可执行文件(ipa包的Frameworks文件下),在运行时调用。

iOS8以后可以有自制动态库,但不是真正意义上的动态库(如UIKit,只会有一份加载,好几个APP共用)

而是Emebed Framework(苹果的说法。这是由于沙盒机制,只是会生成自制动态库可执行文件,主可执行文件两个,自制动态库可执行文件还是只能自身APP使用,别的APP不可以)

参考资料:https://blog.csdn.net/aas319/article/details/78606342

2.运行阶段:我们要谈的运行时主要针对这个阶段,运行时机制类似于执行OC的操作系统,是C&C++混编的
 
KVC:全称 key value coding
KVC底层实现原理其实是消息机制+运行时:
1.先去找属性的setter方法,如果有调用
2.再去找属性名,如果有更改
3.再去找字段(成员变量) 如果有赋值
 
KVO:全称 key value observing
依赖于KVC,动态观察对象某个属性的变化,当观察到变化时会调用observeValueForKeyPath:ofObject:change:context: 方法
 
posted @ 2015-02-07 10:19  小菜看代码  阅读(227)  评论(0)    收藏  举报