結(jié)論:
- 不能向編譯后得到的類(lèi)中增加實(shí)例變量
- 能向運(yùn)行時(shí)創(chuàng)建的類(lèi)中添加實(shí)例變量
解釋?zhuān)?/h3>
因?yàn)榫幾g后的類(lèi)已經(jīng)注冊(cè)在runtime中,類(lèi)結(jié)構(gòu)中的objc_ivar_list實(shí)例變量的鏈表和instance_size實(shí)例變量的內(nèi)存大小已經(jīng)確定,同時(shí)runtime會(huì)調(diào)用class_setIvarLayout或class_setWeakIvarLayout來(lái)處理strong weak引用。所以不能向存在的類(lèi)中添加實(shí)例變量。
運(yùn)行時(shí)創(chuàng)建的類(lèi)是可以添加實(shí)例變量的,調(diào)用class_addIvar函數(shù),但是得在調(diào)用objc_alloccateClassPair之后,objc_registerClassPair之前,原因同上。
疑問(wèn):
能否向編譯后得到的類(lèi)中添加實(shí)例方法?
能,可以通過(guò)runtime給編譯后的類(lèi)中添加實(shí)例方法,由于類(lèi)的內(nèi)存大小和實(shí)例方法的個(gè)數(shù)無(wú)關(guān),和實(shí)例變量的個(gè)數(shù)有關(guān)