一 : 幾種情況底層調(diào)用
減 號
方法底層
加號
方法底層
二 : 面試題
代碼執(zhí)行效果以及原因.
上述代碼結(jié)構(gòu)分析
其代碼結(jié)構(gòu)相當(dāng)于實(shí)例對象的isa指針指向類對象 這個結(jié)構(gòu)一樣,所以能調(diào)用 print
方法
結(jié)果分析
其內(nèi)存結(jié)構(gòu)由低到高地址依次排列,由于在OC中 self.name
是 略過 isa
指針8個字節(jié)地址,直接訪問name
地址,所以在面試代碼中,也可以理解為,略過obj
所指向的cls
地址,訪問最高地址test
假如前面沒有任何局部變量,只有這三行代碼,其實(shí) 是super viewDidLoad 影響了 最終的結(jié)果,super viewDidLoad
底層是 objc_mesSendSuper2其 第一個成員參數(shù)是一個結(jié)構(gòu)體.
內(nèi)存分析
所以cls移動8個字節(jié) 就找到了self
,self
就是viewController
對象,所以結(jié)果是viewController
super的真正樣子
super 在內(nèi)存中真正的樣子
實(shí)際上會調(diào)用objc_msgSendSuper2
方法,第一個參數(shù)為結(jié)構(gòu)體,兩個成員分別為self
和 當(dāng)前類,objc_msgSendSuper2
會自動調(diào)用->superclass在結(jié)構(gòu)體第二參數(shù)父類進(jìn)行搜索.