能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?
- 不能向编译后得到的类中增加实例变量
- 能向运行时创建的类中添加实例变量
-
因为编译后的类已经注册在
runtime
中,类结构体中的objc_ivar_list
(实例变量的链表)和instance_size
(实例变量的内存大小)已经确定;同时runtime
会调用class_setvarlayout
和class_setWeaklvarLayout
来处理strong
、weak
引用。所以不能向编译后得到的类中添加实例变量。 -
运行时创建的类是可以添加实例变量。调用
class_addIvar
函数。但是得在调用objc_allocateClassPair
之后,在objc_registerClassPair
之前。其实就是在编译的过程中向类中添加实例变量,编译后类的实例链表、方法链表、变量大小已经确定。
网友评论