self 和 super
1. self呼叫自己方法,super呼叫父類方法
2. self是類,super是預編譯指令
3.[self class]
和[super class]
輸出是一樣的
self和super底層實現原理:
1、當使用 self 呼叫方法時,會從當前類的方法列表中開始找,如果沒有,就從父類中再找;而當使用 super 時,則從父類的方法列表中開始找,然後呼叫父類的這個方法。
2、當使用 self 呼叫時,會使用 objc_msgsend 函式: id objc_msgsend(id thereceiver, sel theselector, …)。第 乙個引數是訊息接收者,第二個引數是呼叫的具體類方法的 selector,後面是 selector 方法的可變引數。以 [self setname:] 為例,編譯器會替換成呼叫 objc_msgsend 的函式呼叫,其中 thereceiver 是 self,theselector 是 @selector(setname:),這個 selector 是從當前 self 的 class 的方法列表開始找的 setname,當找到後把對應的 selector 傳遞過去。(詳情請看上篇部落格runtime)
3、當使用 super 呼叫時,會使用 objc_msgsendsuper 函式:id objc_msgsendsuper(struct objc_super *super, sel op, …)第乙個引數是個objc_super的結構體,第二個引數還是類似上面的類方法的selector
struct objc_super ;
當編譯器遇到 [super setname:] 時,開始做這幾個事:
1)構 建 objc_super 的結構體,此時這個結構體的第乙個成員變數 receiver 就是 子類,和 self 相同。而第二個成員變數 superclass 就是指父類呼叫 objc_msgsendsuper 的方法,將這個結構體和 setname 的 sel 傳遞過去。
2)函式裡面在做的事情類似這樣:從 objc_super 結構體指向的 superclass 的方法列表開始找 setname 的 selector,找到後再以 objc_super->receiver 去呼叫這個 selector。因此證實了[self class]
和[super class]
輸出是一樣的
IOS self和super詳解實現原理及區別
self和super區別 1 self呼叫自己方法,super呼叫父類方法 2 self是類,super是預編譯指令 3 self class 和 super class 輸出是一樣的 self和super底層實現原理 1 當使用 self 呼叫方法時,會從當前類的方法列表中開始找,如果沒有,就從父...
iOS self和super的區別
首先先寫兩個類 fist和two,two繼承fist類 inte ce first nsobject void seta int c 對a賦值的方法 end implementation first void seta int c end 類2 inte ce two first void setb...
self和super的底層原理
最近列印 nsstringfromclass self class nsstringfromclass super class 是乙個結果,很是納悶。self和super 到底什麼關係和區別?又研究了一遍訊息機制,每次都有一點收穫,但是rumtime簡直不是人看的,那是什麼鬼東西。1.當使用 sel...