創(chuàng)建一個Person類,再創(chuàng)建一個繼承與Person的SonPerson類.
在SonPerson中聲明一個exercise方法打印[self class] [super class]
結(jié)果發(fā)現(xiàn)在子類中打印[self class]與[super class]結(jié)果是相同的,都是打印調(diào)用者的class名稱..SonPerson.
我們知道self是類的隱藏參數(shù),指向調(diào)用方法的這個類的實例.是一個指針.
而super跟self不一樣,并不是指向父類的指針.是一個編譯器修飾符.作用:
用self 調(diào)用方法是從此類的方法列表當(dāng)中找對應(yīng)方法調(diào)用..如果沒有就從父類當(dāng)中找;而super關(guān)鍵詞是從父類的方法列表當(dāng)中找,調(diào)用父類的那個方法..但是這兩種方式,事件的調(diào)用者都是當(dāng)前的實例SonPerson,最終都是找到了NSObject中的class的方法.
從runtime的底層API來看..調(diào)用[self class] 的時候是調(diào)用了objc_msgSend(self,@selector(class)),直接從當(dāng)前實例里找class的實現(xiàn)
調(diào)用[super class]的時候是調(diào)用了objc_msgSendSuper(<#struct objc_super *super#>, <#SEL op, ...#>),里面?zhèn)鲀蓚€參數(shù),
第一個參數(shù)objc_super結(jié)構(gòu)體中有兩個成員.
receiver就是調(diào)用這個事件的接受者.self? ? 然后第二個就是父類的class,Person,然后從這個Person類開始找class方法,一直找到了NSObject,最后這兩個方法都是調(diào)用了 [self class]
打印當(dāng)前類的class.