iOS self 和super原理詳解

2021-07-25 10:08:26 字數 1194 閱讀 9086

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...