oc是一门什么样的语言以及runtime
oc介绍
oc很古老,使用上没有java,swift点语法的酸爽,而是中括号,冗长的命名,可以说oc不是一门简洁的语言
oc的最大特点,就是动态性,与c++静态语言不同,静态语言可以在编译的时候就确定
- 对象的类型
- 调用方法是跳那个地址执行什么指令
- 各种数据结构
而动态语言,在编译时,无法确认这些,而是在程序运行时动态的去确定,比如经常听到的动态类型,动态绑定,动态加载
- 动态类型
// 编译的时候,根据声明顶多知道f是Father类型,但是这个是错误的,所以当我们打程序跑起来,po下f,会是Son类型
// 这就是动态类型了,在运行中才去确定这个指针的类型
Father *f = [Son new];
- 动态绑定
动态绑定是基于动态类型的,确定了类型,就确定了数据结构,才会动态的绑定上这个类对应的属性,方法
- 动态加载
动态加载资源,根据不同的机型加载@1x @2x @3x图
可以看下这个文章
oc怎么做到动态
既然他作为一门动态语言,那么在编译的时候,他应该想办法把将静态语言在编译期确定的事情推迟到运行期
那么这个仅仅靠编译器是不够的,他需要一个运行时系统runtime,这个就是runtime存在的意义,给oc提供动态性,是oc运行框架的基石
oc和runtime的交互
平时我们编写的oc代码,类(NSObject,UIKit等),方法调用(rumtime消息转发),协议,分类等,这一切的oc类,oc特性都是runtime实现的。比如oc的类,本质上就是runtime对应的一些结构体
所以我们经常听到黑魔法,其实所谓的runtime黑魔法,只是基于OC各种底层数据结构上的应用
所以想要了解runtime,我们应该先从runtime是怎么定义类,定义对象,这些数据结构开始