iOS - 關(guān)鍵字self和super

一电谣、selfsuper 區(qū)別

  1. self 是類(lèi),super 是預(yù)編譯指令(就是給編譯器看的抹蚀,不是一個(gè)指針; 只要編譯器看到這個(gè)標(biāo)志剿牺,就會(huì)讓當(dāng)前對(duì)象去調(diào)用父類(lèi)的方法,本質(zhì)還是當(dāng)前對(duì)象在調(diào)用)
  2. self 調(diào)用自己方法环壤,super 是調(diào)用父類(lèi)方法
  3. [self class][super class] 輸出是一樣的(重寫(xiě)了就不一樣了)

二晒来、selfsuper底層實(shí)現(xiàn)原理

  1. 當(dāng)使用 self 調(diào)用方法時(shí),會(huì)從當(dāng)前類(lèi)的方法列表中開(kāi)始找郑现,如果沒(méi)有湃崩,就從父類(lèi)中再找;
    當(dāng)使用 super 時(shí)接箫,則從父類(lèi)的方法列表中開(kāi)始找攒读,然后調(diào)用父類(lèi)的這個(gè)方法。
  2. 當(dāng)使用 self 調(diào)用時(shí)辛友,會(huì)使用 objc_msgSend 函數(shù):id objc_msgSend(id theReceiver,SEL theSelector, ...)
    第一個(gè)參數(shù)是消息接收者薄扁,第二個(gè)參數(shù)是調(diào)用的具體類(lèi)方法的 selector剪返,第三個(gè)參數(shù)是 selector 方法的可變參數(shù)。
    (以: [self setName:] 為例分析:
    a: 編譯器會(huì)替換成調(diào)用 objc_msgSend的函數(shù)調(diào)用邓梅,
    b: 其中 theReceiverself脱盲,theSelector@selector(setName:),這個(gè) selector 是從當(dāng)前 selfclass 的方法列表開(kāi)始找的 setName日缨,
    c: 當(dāng)找到后把對(duì)應(yīng)的 selector傳遞過(guò)去钱反。)
  3. 當(dāng)使用 super 調(diào)用時(shí),會(huì)使用 objc_msgSendSuper 函數(shù):id objc_msgSendSuper(struct objc_super *super,SEL op, ...)
    第一個(gè)參數(shù)是個(gè) objc_super 的結(jié)構(gòu)體匣距,
    第二個(gè)參數(shù)還是類(lèi)似上面的類(lèi)方法的 selector
struct objc_super {
    id receiver;
    Class superClass; 
};

(以: [super setName:]為例分析:
a: 構(gòu)建 objc_super 的結(jié)構(gòu)體面哥,此時(shí)這個(gè)結(jié)構(gòu)體的第一個(gè)成員變量 receiver 就是子類(lèi),和 self 相同墨礁。而第二個(gè)成員變量 superClass 就是指父類(lèi)調(diào)用 objc_msgSendSuper 的方法幢竹,將這個(gè)結(jié)構(gòu)體和 setNamesel 傳遞過(guò)去
b: 函數(shù)里面在做的事情類(lèi)似這樣:從 objc_super 結(jié)構(gòu)體指向的 superClass 的方法列表開(kāi)始找 setNameselector,找到后再用 objc_super 結(jié)構(gòu)體的 receiver 去調(diào)用這個(gè) selector

三恩静、為什么要 self = [super init];

符合 objective-c 繼承類(lèi)初始化規(guī)范焕毫, super 同樣也是這樣。
self = [super init] 中的 [super init] 是去 selfsuper 中調(diào)用 init驶乾,而 super 還會(huì)繼續(xù)調(diào)用 supersuperinit邑飒, 直到根類(lèi) NSObject 中的 init
根類(lèi)中 init負(fù)責(zé)初始化內(nèi)存區(qū)域级乐, 向里面添加 一些必要的屬性疙咸,返回內(nèi)存指針,這樣, 延著繼承鏈初始化的內(nèi)存指針會(huì)被從上到下傳遞风科,在不同的子類(lèi)中向塊內(nèi)存添加子類(lèi)必要的屬性撒轮,直到使用的本類(lèi)中得到內(nèi)存指針,賦值給 slef 參數(shù)贼穆。

四题山、classsuperClass區(qū)別

class獲取當(dāng)前方法調(diào)用者的類(lèi)
superclass獲取當(dāng)前方法調(diào)用者的父類(lèi)

#import "Son.h"

@interface Son : Person

@end

@implementation Son

- (instancetype)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));       // 獲取當(dāng)前方法調(diào)用者的類(lèi) (Son)
        NSLog(@"%@", NSStringFromClass([super class]));      // 本質(zhì)還是當(dāng)前方法調(diào)用者 (Son)
        NSLog(@"%@", NSStringFromClass([self superclass]));  // 當(dāng)前方法調(diào)用者的父類(lèi) (Person)
        NSLog(@"%@", NSStringFromClass([super superclass])); // 當(dāng)前方法調(diào)用者的父類(lèi) (Person)
    }
    return self;
}

@end
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末故痊,一起剝皮案震驚了整個(gè)濱河市顶瞳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愕秫,老刑警劉巖慨菱,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異戴甩,居然都是意外死亡符喝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)等恐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洲劣,“玉大人备蚓,你說(shuō)我怎么就攤上這事课蔬〈鸦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵二跋,是天一觀的道長(zhǎng)战惊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扎即,這世上最難降的妖魔是什么吞获? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谚鄙,結(jié)果婚禮上各拷,老公的妹妹穿的比我還像新娘。我一直安慰自己闷营,他們只是感情好烤黍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著傻盟,像睡著了一般速蕊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娘赴,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天规哲,我揣著相機(jī)與錄音,去河邊找鬼诽表。 笑死唉锌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竿奏。 我是一名探鬼主播袄简,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼议双!你這毒婦竟也來(lái)了痘番?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤平痰,失蹤者是張志新(化名)和其女友劉穎汞舱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宗雇,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昂芜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赔蒲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泌神。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡良漱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欢际,到底是詐尸還是另有隱情母市,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布损趋,位于F島的核電站患久,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浑槽。R本人自食惡果不足惜蒋失,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桐玻。 院中可真熱鬧篙挽,春花似錦、人聲如沸镊靴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邑闲。三九已至算行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苫耸,已是汗流浹背州邢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褪子,地道東北人量淌。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嫌褪,于是被迫代替她去往敵國(guó)和親呀枢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容