self和super的底層原理

2021-07-04 22:10:42 字數 1132 閱讀 4218

最近列印 nsstringfromclass([self class])

nsstringfromclass([super class]) 是乙個結果,很是納悶。

. self和super 到底什麼關係和區別?

又研究了一遍訊息機制,每次都有一點收穫,但是rumtime簡直不是人看的,那是什麼鬼東西。

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 傳遞過去。

當使用 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

OC中self和super的使用

1 self用在物件方法中,self指代的是呼叫當前方法的那個物件,可以呼叫其它物件方法。2 self用在類方法中,self指代的是當前類,可以呼叫其它類方法,不可以呼叫物件方法。3 self修飾例項變數 一般在set方法中使用 用在形參變數和例項變數同名時。例 void setspeed int ...

在OC中,super和self的用法

super 指代的是父類物件 super bark 呼叫了父類的bark方法 1 self用在物件方法中,self指代的是呼叫當前方法的那個物件,可以呼叫其它物件方法。2 self用在類方法中,self指代的是當前類,可以呼叫其它類方法,不可以呼叫物件方法。3 self修飾例項變數 一般在set方法...

OC語言基礎六 self和super

oc語言的self相當於c 語言的this,是乙個指標,隨著類的建立預設被建立出來。self和super的使用範圍是在類的內部,都只能用來呼叫方法。instancetype person void setname nsstring name person person self alloc init...