Objective-C中的self和super理解

GabrielPanda發表於2019-01-21
@implementation xxx : NSObject
- (id)init {
    self = [super init];
    if (self) {
    }
    return self;
}

複製程式碼

1、self是一個隱藏引數變數

self是一個隱藏引數變數,指向當前呼叫方法的物件,還有一個隱藏引數是_cmd,代表當前方法selector。在runtime時會呼叫objc_msgSend()方法。

2、super是預編譯指令

super並不是隱藏引數,只是編譯器的指令符號,在runtime時呼叫objc_msgSendSuper()方法。

當使用 super 呼叫時,執行時會使用 objc_msgSendSuper 函式:

id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
複製程式碼

objc_super的結構體如下:

struct objc_super {
id receiver;
Class superClass;
};
複製程式碼

當編譯器遇到 [super xxxx:] 時,開始做下面幾個事:

1)構建objc_super的結構體,receiver就是子類,和 self 中相同。
superClass就是父類呼叫 objc_msgSendSuper 的方法,將這個結構體和xxxx的selector傳遞過去。

2)從objc_super結構體指向的superClass的方法列表開始找 xxxx的selector,
找到後再用objc_super->receiver去呼叫這個selector。

複製程式碼

知道self和super的原理就會很容易明白為什麼[self class]和[super class]輸出結果會是一樣的。

[super init]去self的super中呼叫init, 然後super會呼叫其父類的init,以此類推,直到找到根類NSObject中的init。 然後根類中的init負責初始化記憶體區域,新增一些必要的屬性,返回記憶體指標,延著繼承鏈,指標從上到下進行傳遞,同時在不同的子類中可以向記憶體新增必要的屬性。 最後當前類中把記憶體地址賦值給self引數。

相關文章