iOS:關(guān)于super 關(guān)鍵字的坑(從runtime來(lái)分析)

創(chuàng)建一個(gè)Person類(lèi),再創(chuàng)建一個(gè)繼承與Person的SonPerson類(lèi).

在SonPerson中聲明一個(gè)exercise方法打印[self class] [super class]

結(jié)果發(fā)現(xiàn)在子類(lèi)中打印[self class]與[super class]結(jié)果是相同的,都是打印調(diào)用者的class名稱(chēng)..SonPerson.

我們知道self是類(lèi)的隱藏參數(shù),指向調(diào)用方法的這個(gè)類(lèi)的實(shí)例.是一個(gè)指針.

而super跟self不一樣,并不是指向父類(lèi)的指針.是一個(gè)編譯器修飾符.作用:

用self 調(diào)用方法是從此類(lèi)的方法列表當(dāng)中找對(duì)應(yīng)方法調(diào)用..如果沒(méi)有就從父類(lèi)當(dāng)中找;而super關(guān)鍵詞是從父類(lèi)的方法列表當(dāng)中找,調(diào)用父類(lèi)的那個(gè)方法..但是這兩種方式,事件的調(diào)用者都是當(dāng)前的實(shí)例SonPerson,最終都是找到了NSObject中的class的方法.

從runtime的底層API來(lái)看..調(diào)用[self class] 的時(shí)候是調(diào)用了objc_msgSend(self,@selector(class)),直接從當(dāng)前實(shí)例里找class的實(shí)現(xiàn)

調(diào)用[super class]的時(shí)候是調(diào)用了objc_msgSendSuper(<#struct objc_super *super#>, <#SEL op, ...#>),里面?zhèn)鲀蓚€(gè)參數(shù),

第一個(gè)參數(shù)objc_super結(jié)構(gòu)體中有兩個(gè)成員.

receiver就是調(diào)用這個(gè)事件的接受者.self? ? 然后第二個(gè)就是父類(lèi)的class,Person,然后從這個(gè)Person類(lèi)開(kāi)始找class方法,一直找到了NSObject,最后這兩個(gè)方法都是調(diào)用了 [self class]

打印當(dāng)前類(lèi)的class.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容