Runtime系列(引文)

super是什么晨汹?先別急著回答踱葛,看看下面這段代碼

示例代碼.png

說一下繼承關系:Person -> Animal -> NSObject

NSLog(@"super---%@", [super className]);

這行代碼的運行結(jié)果可能和預期的不太一樣,不應該是Animal嗎炉爆?Xcode又抽了蔬浙?當然不是,讓我們重新認識一下super誊爹。

self與super

  • self和_cmd是類的隱藏參數(shù)
  • 誰調(diào)用self蹬刷,self就指向誰,如類方法中的self指向當前類對象频丘,對象方法中的self指向當前類的實例對象(如果父類中某個類\對象方法有self办成,子類調(diào)用父類的這個方法,此時父類中的self指向子類的類\實例)
  • _cmd其實是個SEL搂漠,下面這行代碼在哪里調(diào)用迂卢,就會打印當前調(diào)用方法的方法名,作用類似于__func__
NSLog(@"%@", NSStringFromSelector(_cmd));
  • super并不是父類標示符,而是編譯器的指示符冷守,怎么理解刀崖?讓我們重新回到這里
NSLog(@"super---%@", [super className]);
NSLog(@"self---%@", [self className]);

className是NSObject的屬性,而代碼中沒有重寫 -(NSString *)className拍摇,所以兩處打印都是調(diào)用NSObject中的get方法亮钦。那么底層究竟是怎么實現(xiàn)的?

屏幕快照 .png

self調(diào)用時

id objc_msgSend(id self充活, SEL op蜂莉, ...)

super調(diào)用時

id objc_msgSendSuper(struct objc_super *super, SEL op混卵, ...)

淺析數(shù)據(jù)結(jié)構

為了更好的理解參數(shù)含義映穗,我們先看看id、objc_super究竟分別是什么

id.png

可以看到幕随,id本質(zhì)是結(jié)構體objc_object的指針蚁滋,其中有一個Class isa成員,通過isa我們可以找到對象所屬的類別赘淮,這也是為什么id可以表示任意對象的原因
注意:在KVO中辕录,isa在運行時會被修改,指向一個中間類梢卸,對于編譯器而言走诞,isa的指向才是最真實的類型

objc_super.png

receiver表示某個子類的實例,super_class表示當前類的父類

底層實現(xiàn)

接著我們來看看調(diào)用[receiver message]會做些什么

  • objc_msgSend
id objc_msgSend(id self蛤高, SEL op蚣旱, ...)

receiver通過isa指針找到當前對象的class,并在class中尋找op戴陡,如果找到塞绿,調(diào)用op,如果沒找到恤批,到super_class中繼續(xù)尋找位隶,如此循環(huán)直到NSObject(后續(xù)文章會介紹如果NSObject中還是沒找到會怎樣)

不難看出[self className]在NSObject中找到對應的方法并調(diào)用,所以返回Person

  • objc_msgSendSuper
id objc_msgSendSuper(struct objc_super *super开皿, SEL op涧黄, ...)

本文中[super className]對應到objc_super,receiver表示Person的實例赋荆,super_class表示Animal類笋妥。同樣,先在super_class查找窄潭,沒找到op再到super_class的super_class中查找春宣,在NSObject中找到op。此時內(nèi)部的調(diào)用情況是這樣的:

objc_msgSend(objc_super -> receiver, @selector(className)月帝, ...)

這里的objc_super -> receiver就是Person的實例躏惋,所以[super className]的運行結(jié)果仍然是Person而不是Animal

題外話

現(xiàn)在撇開Runtime回到示例代碼本身,如果讓[super className]運行的結(jié)果是Animal要怎么做嚷辅?
一種做法是簿姨,在Animal中重寫className的get方法:

- (NSString *)className {
    
    return NSStringFromClass([Animal class]);
}

當然,由于在Animal中重寫了這個方法簸搞,此時Person中的

NSLog(@"super---%@", [super className]);
NSLog(@"self---%@", [self className]);

輸出均為Animal

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扁位,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子趁俊,更是在濱河造成了極大的恐慌域仇,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺擂,死亡現(xiàn)場離奇詭異暇务,居然都是意外死亡,警方通過查閱死者的電腦和手機怔软,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門般卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爽雄,你說我怎么就攤上這事°迨螅” “怎么了挚瘟?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饲梭。 經(jīng)常有香客問我乘盖,道長,這世上最難降的妖魔是什么憔涉? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任订框,我火速辦了婚禮,結(jié)果婚禮上兜叨,老公的妹妹穿的比我還像新娘穿扳。我一直安慰自己,他們只是感情好国旷,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布矛物。 她就那樣靜靜地躺著,像睡著了一般跪但。 火紅的嫁衣襯著肌膚如雪履羞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音忆首,去河邊找鬼爱榔。 笑死,一個胖子當著我的面吹牛糙及,可吹牛的內(nèi)容都是我干的详幽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼丁鹉,長吁一口氣:“原來是場噩夢啊……” “哼妒潭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揣钦,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤雳灾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冯凹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎亩,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年宇姚,在試婚紗的時候發(fā)現(xiàn)自己被綠了匈庭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑劳,死狀恐怖阱持,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魔熏,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布蒜绽,位于F島的核電站镶骗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躲雅。R本人自食惡果不足惜鼎姊,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望相赁。 院中可真熱鬧相寇,春花似錦、人聲如沸钮科。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跺嗽。三九已至战授,卻和暖如春页藻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背植兰。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工份帐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楣导。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓废境,卻偏偏與公主長得像,于是被迫代替她去往敵國和親筒繁。 傳聞我的和親對象是個殘疾皇子噩凹,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • runtime 運行時語言毡咏,實現(xiàn)Object-C的C語言庫驮宴,將OC轉(zhuǎn)換成C進行編譯的過渡者。 作為一門動態(tài)編程語言...
    夜雨聲煩_閱讀 545評論 0 0
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言呕缭,那么這個「動態(tài)」表現(xiàn)在哪呢堵泽?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評論 0 7
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 729評論 0 2
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,132評論 0 9