底層經(jīng)典面試題

前言:先來張熟悉又陌生的圖:

isa流程圖.png

【面試題一】iskindOfClass& isMemberOfClass 的理解
下面代碼亏娜,怎么打印焕窝,并分析原因

int main(int argc, const char * argv[]) {
    @autoreleasepool {
      //-----使用 iskindOfClass & isMemberOfClass 類方法
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];       //
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];     //
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];       //
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]];     //
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);  
//------iskindOfClass & isMemberOfClass 實例方法
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];       //
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];     //
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];       //
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];     //
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
    }
    return 0;
}

打印如下:

re1 :1
re2 :0
re3 :0
re4 :0
re5:1
re6:1
re7:1
re8:1

結(jié)果已給,你細品照藻,你細細的品袜啃;接下來汗侵,解釋一波幸缕,有錯,請留言晰韵,不要發(fā)紅包发乔。

源碼分析一波

-isKindOfClass 源碼解析(實例方法 & 類方法)

//--isKindOfClass---類方法、對象方法
//+ isKindOfClass:第一次比較是 獲取類的元類 與 傳入類對比雪猪,再次之后的對比是獲取上次結(jié)果的父類 與 傳入 類進行對比
+ (BOOL)isKindOfClass:(Class)cls {
   // 獲取類的元類 vs 傳入類
   // 根元類 vs 傳入類
   // 根類 vs 傳入類
   // 舉例:LGPerson vs 元類 (根元類) (NSObject)
   for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
       if (tcls == cls) return YES;
   }
   return NO;
}

//- `isKindOfClass`:第一次是獲取對象類 與 傳入類對比栏尚,如果不相等,后續(xù)對比是繼續(xù)獲取上次 類的父類 與傳入類進行對比
- (BOOL)isKindOfClass:(Class)cls {
/*
獲取對象的類 vs 傳入的類 
父類 vs 傳入的類
根類 vs 傳入的類
nil vs 傳入的類
*/
   for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
       if (tcls == cls) return YES;
   }
   return NO;
}

  • isMemberOfClass源碼解析(實例方法 & 類方法)
//-----類方法
//+ isMemberOfClass : 獲取類的元類只恨,與 傳入類對比
+ (BOOL)isMemberOfClass:(Class)cls {
    return self->ISA() == cls;
}
//-----實例方法
//- isMemberOfClass : 獲取對象的類译仗,與 傳入類對比
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

"強行解釋一波"是有依據(jù)的,總結(jié)如下:
<article class="_2rhmJa">

  • isKindOfClass

    • 類方法:元類 --> 根元類 --> 根類 --> nil傳入類的對比
    • 實例方法:對象的類 --> 父類 --> 根類 --> nil傳入類的對比
  • isMemberOfClass

    • 類方法: 類的元類傳入類 對比
    • 實例方法:對象的父類傳入類 對比

案例代碼執(zhí)行結(jié)果分析

根據(jù)源碼的分析官觅,來分析代碼執(zhí)行的結(jié)果為什么是0或者1

使用類方法結(jié)果解析

  • re1 :1 纵菌,是 NSObjectNSObject 的對比,使用 +isKindOfClass

    • NSObject(傳入類休涤,即根類) vs NSObject的元類即根元類-- 不相等
    • NSObject(傳入類咱圆,即根類) vs 根元類的父類即根類 -- 相等,返回1
  • re2 :0 功氨,是 NSObjectNSObject 的對比序苏,使用 +isMemberOfClass

    • NSObject根類(傳入類) vs NSObject的元類即根元類 -- 不相等
  • re3 :0 ,是 LGPersonLGPerson 的對比捷凄,使用 +isisKindOfClass

    • LGPerson(傳入) vs LGPerson的元類即元類LGPerson -- 不相等
    • LGPerson(傳入) vs 元類LGPerson的父類即根元類 -- 不相等
    • LGPerson(傳入) vs 根元類的父類即根類 -- 不相等
    • LGPerson(傳入) vs 根類的父類即 nil -- 不相等
  • re4 :0 忱详,是 LGPersonLGPerson 的對比,使用 +isMemberOfClass

    • LGPerson(傳入) vs 元類 -- 不相等

使用實例方法結(jié)果解析

  • re5 :1 跺涤,是 NSObject對象NSObject 的對比踱阿,使用 -isKindOfClass

    • NSObject(傳入類,即根類) vs 對象的類即NSObject根類 -- 相等
  • re6 :1 钦铁,是 NSObject對象NSObject 的對比软舌,使用 -isMemberOfClass

    • NSObject(傳入類,即根類) vs 對象的類即NSObject根類 -- 相等
  • re7 :1 牛曹,是 LGPerson對象LGPerson 的對比佛点,使用 -isKindOfClass

    • LGPerson(傳入類) vs 對象的類即LGPerson -- 相等
  • re8 :1 ,是 LGPerson對象LGPerson 的對比,使用 -isMemberOfClass

    • NSObject(傳入類) vs 對象的類即LGPerson -- 相等
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末超营,一起剝皮案震驚了整個濱河市鸳玩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌演闭,老刑警劉巖不跟,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米碰,居然都是意外死亡窝革,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門吕座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虐译,“玉大人,你說我怎么就攤上這事吴趴∑岱蹋” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵锣枝,是天一觀的道長厢拭。 經(jīng)常有香客問我,道長撇叁,這世上最難降的妖魔是什么供鸠? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮税朴,結(jié)果婚禮上回季,老公的妹妹穿的比我還像新娘。我一直安慰自己正林,他們只是感情好泡一,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觅廓,像睡著了一般鼻忠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杈绸,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天帖蔓,我揣著相機與錄音,去河邊找鬼瞳脓。 笑死塑娇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的劫侧。 我是一名探鬼主播埋酬,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哨啃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了写妥?” 一聲冷哼從身側(cè)響起拳球,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎珍特,沒想到半個月后祝峻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡扎筒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年莱找,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸琅。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宋距,死狀恐怖轴踱,靈堂內(nèi)的尸體忽然破棺而出症脂,到底是詐尸還是另有隱情,我是刑警寧澤淫僻,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布诱篷,位于F島的核電站,受9級特大地震影響雳灵,放射性物質(zhì)發(fā)生泄漏棕所。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一悯辙、第九天 我趴在偏房一處隱蔽的房頂上張望琳省。 院中可真熱鬧,春花似錦躲撰、人聲如沸针贬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桦他。三九已至,卻和暖如春谆棱,著一層夾襖步出監(jiān)牢的瞬間快压,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工垃瞧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔫劣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓个从,卻偏偏與公主長得像脉幢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354