Objective-C中的self和super理解

@implementation xxx : NSObject
- (id)init {
    self = [super init];
    if (self) {
    }
    return self;
}

複製代碼

一、self是一個隱藏參數變量

self是一個隱藏參數變量,指向當前調用方法的對象,還有一個隱藏參數是_cmd,表明當前方法selector。在runtime時會調用objc_msgSend()方法。bash

二、super是預編譯指令

super並非隱藏參數,只是編譯器的指令符號,在runtime時調用objc_msgSendSuper()方法。函數

當使用 super 調用時,運行時會使用 objc_msgSendSuper 函數:ui

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

objc_super的結構體以下:spa

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]輸出結果會是同樣的。code

[super init]去self的super中調用init, 而後super會調用其父類的init,以此類推,直到找到根類NSObject中的init。 而後根類中的init負責初始化內存區域,添加一些必要的屬性,返回內存指針,延着繼承鏈,指針從上到下進行傳遞,同時在不一樣的子類中能夠向內存添加必要的屬性。 最後當前類中把內存地址賦值給self參數。對象

相關文章
相關標籤/搜索