2.Runtime系列-OC 动态性

OC 中的动态性

从编译时和运行时说起

编译时:编译器对语言的编译阶段,只是对语言进行最基本的检查报错,包括语法分析,词法分析,将程序代码翻译成为计算机能够识别的语言(如汇编),编译通过并不意味程序可以成功运行.

运行时:级程序通过上面编译时阶段装载到内存中运行起来的阶段,这个时候会对类型检查,而不仅仅是对代码的简单扫描分析,此时若出错程序会崩溃.

由此编译时是一个静态阶段,运行时是一个动态阶段,开始和环境结合起来.

何为动态性

动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。Objective-C虽然在写程序时声明了变量的数据类型,但是在编译期间并没有检查。因为Objective-C类和对象都是在运行时候创建的,所以编译期间没办法检查。

tip:两者的区别在于是否在编译期间做数据类型检查。

objective-c 动态性主要体现在以下几点

  • 动态类型:运行时确定对象类型

  • 动态绑定:运行时确定对象的调用方法

  • 动态加载:运行时加载需要的资源或者可执行代码

动态库静态库区别

静态库和动态库是相对编译期和运行期的,静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库.

而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

相关延伸

1. Dylb 动态链接

  1. APP 启动流程
  2. 加载可执行文件(读取Mach-O)
  3. 加载动态库(Dylib)
  4. Rebase & Bind
  5. Objc
  6. Initializers

2. load和initialize方法

  • 看图来对比

posted @ 2020-03-03 11:19  小天才努努  阅读(186)  评论(0)    收藏  举报