oc是一门什么样的语言以及runtime

oc是一门什么样的语言以及runtime

oc介绍

oc很古老,使用上没有java,swift点语法的酸爽,而是中括号,冗长的命名,可以说oc不是一门简洁的语言

oc的最大特点,就是动态性,与c++静态语言不同,静态语言可以在编译的时候就确定

  • 对象的类型
  • 调用方法是跳那个地址执行什么指令
  • 各种数据结构

而动态语言,在编译时,无法确认这些,而是在程序运行时动态的去确定,比如经常听到的动态类型,动态绑定,动态加载

  • 动态类型
// 编译的时候,根据声明顶多知道f是Father类型,但是这个是错误的,所以当我们打程序跑起来,po下f,会是Son类型

// 这就是动态类型了,在运行中才去确定这个指针的类型
Father *f = [Son new];
  • 动态绑定

动态绑定是基于动态类型的,确定了类型,就确定了数据结构,才会动态的绑定上这个类对应的属性,方法

  • 动态加载

动态加载资源,根据不同的机型加载@1x @2x @3x图

可以看下这个文章

用户在 app store 上看到的包大小究竟是什么?

oc怎么做到动态

既然他作为一门动态语言,那么在编译的时候,他应该想办法把将静态语言在编译期确定的事情推迟到运行期

那么这个仅仅靠编译器是不够的,他需要一个运行时系统runtime,这个就是runtime存在的意义,给oc提供动态性,是oc运行框架的基石

oc和runtime的交互

平时我们编写的oc代码,类(NSObject,UIKit等),方法调用(rumtime消息转发),协议,分类等,这一切的oc类,oc特性都是runtime实现的。比如oc的类,本质上就是runtime对应的一些结构体

所以我们经常听到黑魔法,其实所谓的runtime黑魔法,只是基于OC各种底层数据结构上的应用

所以想要了解runtime,我们应该先从runtime是怎么定义类,定义对象,这些数据结构开始

runtime的各种数据结构

你可能感兴趣的:(oc是一门什么样的语言以及runtime)