浅谈OC的编译时和运行时

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

特点:
是静态阶段,类型错误很明显可以直接检查出来

运行时:
程序通过了编译后,编译好的代码被装载到内存中跑起来的阶段,这个时候会具体对类型进行检查,而不仅仅是对代码简单扫描分析,此时若出错,程序会崩溃。

特点:
是动态阶段,开始具体与运行环境结合起来

不能向编译后得到的类中增加实例变量。
原因:
1、编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定
2、同时runtime 会调用class_setIvarLayout 或 class_setWeakIvarLayout来处理strong weak引用,所以不能向存在的类中添加实例变量。

可以向运行时创建的类中添加实例变量。
实现:
在调用 objc_allocateClassPair 之后,objc_registerClassPair 之前,调用 class_addIvar 函数

版权声明:
作者:congcong
链接:https://www.techfm.club/p/49450.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>