@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引數。