浅谈OC的编译时和运行时

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

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

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容