Skip to content

Latest commit

 

History

History
executable file
·
44 lines (21 loc) · 2.23 KB

objc语言的运行时特性.md

File metadata and controls

executable file
·
44 lines (21 loc) · 2.23 KB

objc语言的运行时特性

起因

网上已经有很多关于objc运行时特性的详细分析,本来没有再写的必要。

但发现公司的小伙伴理解起来比较吃力,感觉是学习方法不对,之前也说过,通过原理学习理解起来更透彻,而且也没必要一个个特性去学习和记忆,理解原理后,需要时再去查阅相关api就好了。

恩,blog的东西基本都是给公司做技术分享用的。

模拟objc运行库实现

只需要几十行代码就可以模拟最简单的运行库,代码什么都干不了,只是可以运行起来,用于我们理解objc的实现原理。

代码地址: objc_runtime

代码里的注释已经描述了基本运行时,大家可以直接源码里看。

运行时要点

  • objective c语言具有动态类型语言的特征,但它不是通过动态语言的解释器方式工作,而是本地二进制运行,因此,兼具动态特征与本地性能的折中。

  • 实现原理:通过本地c语言抽象出对象、多态的概念,封装成运行库,在编译器侧建立面向对象语言的语法,编译器将语法预编译为c语言,在编译到本地目标文件。

  • 在objective c中,有对象和类,还有元类的概念,类一般保存实例方法,元类保存静态方法。

  • 通过实现,可以看出在实现侧对象、类、元类都是内存中运行时的对象,没有本质区别,唯一区别仅仅是职责分工不同,也正因为都是内存中的对象,所以在运行时可以做到动态修改。

  • 封装:通过结构体封装属性和方法实现

  • 继承:通过superClass指向父类实现

  • 多态:通过动态方法查找实现

  • 既然所有内容均在内存中,意味着一切都可运行时修改,包括对象、类、元类、继承关系、方法、属性等等。

结尾

这里关于objc的运行时特性基本一个都没说,但如果你看明白了demo,我想无论哪个特性,大概看一眼就能明白是怎么回事儿了。

objective c语言被人诟病为类型不安全,这其实是取舍问题,想要这么强大的动态特性,必然要在其他方面做些牺牲。