一個(gè)Student類(lèi)中包含name屬性和print方法 如圖2
圖一中方法執(zhí)行 請(qǐng)問(wèn)是否會(huì)崩潰
并不會(huì)崩潰 但會(huì)打印如圖3
obj->cls->[Student class]
正常調(diào)用時(shí) 聲明的Student類(lèi)屬性student -> isa ->?[Student class]
內(nèi)存結(jié)構(gòu)相同 所以可以調(diào)用print方法 可以理解 cls即是isa
函數(shù)調(diào)用 是通過(guò)查找isa 其本質(zhì)是查找結(jié)構(gòu)體的前8個(gè)字節(jié)?
前8個(gè)字節(jié)正好是isa 所以可以理解為 cls == isa
那為何會(huì)打印 viewcontroller?
局部變量是分配在棧中 棧的內(nèi)存分配是從高地址到低地址 棧的內(nèi)存分配是連續(xù)的
要打印的name 成員變量 是通過(guò)self-> 去查找?
[(__bridge id)obj print] 即是通過(guò)obj開(kāi)始查找
而name 是通過(guò)指針地址查找 需要查找Student結(jié)構(gòu)體
Student中就兩個(gè)變量 所以找name 就是找到isa 再跳過(guò)8個(gè)字節(jié) 及是name
前面解釋道cls和isa指向同一地址 所以跳過(guò)8個(gè)字節(jié)即是[super viewdidload]
如果再添加其他屬性 則不一定找得到值 會(huì)崩潰
&cls 即obj指向的內(nèi)存是Strudent結(jié)構(gòu)體isa地址 isa指針占用8字節(jié)?
跳過(guò)8字節(jié)即和str地址相同 則title的值時(shí)abc?
而name NSstring*占用8字節(jié) str1 是int類(lèi)型占用4字節(jié) 內(nèi)存地址對(duì)應(yīng)不上 則會(huì)崩潰