結(jié)論:
- 不能向編譯后得到的類中增加實例變量
- 能向運行時創(chuàng)建的類中添加實例變量
解釋:
因為編譯后的類已經(jīng)注冊在runtime中,類結(jié)構(gòu)中的objc_ivar_list實例變量的鏈表和instance_size實例變量的內(nèi)存大小已經(jīng)確定康铭,同時runtime會調(diào)用class_setIvarLayout或class_setWeakIvarLayout來處理strong weak引用惯退。所以不能向存在的類中添加實例變量。
運行時創(chuàng)建的類是可以添加實例變量的从藤,調(diào)用class_addIvar函數(shù)催跪,但是得在調(diào)用objc_alloccateClassPair之后,objc_registerClassPair之前夷野,原因同上懊蒸。
疑問:
能否向編譯后得到的類中添加實例方法?
能悯搔,可以通過runtime給編譯后的類中添加實例方法榛鼎,由于類的內(nèi)存大小和實例方法的個數(shù)無關,和實例變量的個數(shù)有關