iOS之isKindOfClas时肿、isMemberOfClass區(qū)別

首先我們先來看一段代碼:

@interface Person : NSObject
@end
@implementation Person
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...

        NSLog(@"%@", [NSObject class]);
        NSLog(@"%@", [Person class]);

        BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
        BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
        BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
        BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
        NSLog(@"%d--%d--%d--%d", res1, res2, res3, res4);
    }
    return 0;
}

輸入結(jié)果:

 NSObject
 Person
 1-0-0-0

可能執(zhí)行結(jié)果出乎大多數(shù)人的意料,

如果不是很清楚對象恃锉、類對象搀菩、元類關(guān)系的,可以先看一下下圖:


對象破托、類對象肪跋、元類關(guān)系.png
  • 對象的isa指針指向類對象
  • 類對象的指針指向元類
//類對象返回自身
+ (Class)class {
    return self;
}

[NSObject class]、[Person class]返回還是當(dāng)前類對象

下面可以看看兩個isMemberOfClass炼团、isKindOfClass內(nèi)部實(shí)現(xiàn)澎嚣,

//isMemberOfClass實(shí)現(xiàn)
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

isMemberOfClass比較兩個isa指向的類對象是否一樣。

能判斷對象是否是當(dāng)前類的實(shí)例對象.

//isKindOfClass實(shí)現(xiàn)
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}

前者對象的(class)類對象是否與后者類對象相同瘟芝,如果相同返回YES
不相等的話就易桃,就繼續(xù)對象的類對象的superclass看是否相等,一直找到根類

一锌俱、 [(id)[NSObject class] isKindOfClass:[NSObject class]];

其實(shí)通過isKindOfClass內(nèi)部實(shí)現(xiàn)源碼晤郑,可以理解為:

  • 前者[[NSObject class] class](NSObject的Meta Class)與后者[NSObject class](NSObject的class)是否相等
  • 相等返回true
  • 不相等的話,就遍歷NSObject的元類的superclass,看是否相等.
  • 如上圖NSObject的元類的superclass指向NSObject的類對象,所以返回的true造寝。

二磕洪、[(id)[NSObject class] isMemberOfClass:[NSObject class]]

  • isMemberOfClass只能判斷對象是否是當(dāng)前類的實(shí)例對象,NSObject的元類肯定不是NSObject類對象的實(shí)例诫龙。所以返回false析显。

三、[(id)[Person class] isKindOfClass:[Sark class]];

執(zhí)行流程大概是這樣:

  • [[Person class]class] 執(zhí)行完之后調(diào)用 isKindOfClass签赃,
    1. 第一次 for 循環(huán)谷异,Person 的 Meta Class 與 [Person class] 不等,
    2. 第二次 for 循環(huán)锦聊,Person Meta Class 的 super class 指向的是 NSObject Meta Class歹嘹, 和 Person Class 不相等。
    3. 第三次 for 循環(huán)孔庭,NSObject Meta Class 的 super class 指向的是 NSObject Class尺上,和 Person Class 不相等。
    4. 第四次循環(huán)圆到,NSObject Class 的super class 指向 nil怎抛, 和 Person Class 不相等。第四次循環(huán)之后构资,退出循環(huán)抽诉,所以第三行的 res3 輸出為 NO。

四吐绵、[(id)[Sark class] isMemberOfClass:[Sark class]]

isa 指向 Person 的 Meta Class迹淌,和 Person Class 也不等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末己单,一起剝皮案震驚了整個濱河市唉窃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纹笼,老刑警劉巖纹份,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異廷痘,居然都是意外死亡蔓涧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門笋额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來元暴,“玉大人,你說我怎么就攤上這事兄猩≤哉担” “怎么了鉴未?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸠姨。 經(jīng)常有香客問我铜秆,道長,這世上最難降的妖魔是什么讶迁? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任连茧,我火速辦了婚禮,結(jié)果婚禮上添瓷,老公的妹妹穿的比我還像新娘梅屉。我一直安慰自己值纱,他們只是感情好鳞贷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐唠,像睡著了一般搀愧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆偿,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天咱筛,我揣著相機(jī)與錄音,去河邊找鬼杆故。 笑死迅箩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的处铛。 我是一名探鬼主播饲趋,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撤蟆!你這毒婦竟也來了奕塑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤家肯,失蹤者是張志新(化名)和其女友劉穎龄砰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讨衣,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡换棚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了反镇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固蚤。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愿险,靈堂內(nèi)的尸體忽然破棺而出颇蜡,到底是詐尸還是另有隱情价说,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布风秤,位于F島的核電站鳖目,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缤弦。R本人自食惡果不足惜领迈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碍沐。 院中可真熱鬧狸捅,春花似錦、人聲如沸累提。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斋陪。三九已至朽褪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无虚,已是汗流浹背缔赠。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留友题,地道東北人嗤堰。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像度宦,于是被迫代替她去往敵國和親踢匣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355