isMemberOfClass和isKindOfClass底層分析

為了方便講解饵撑,以下列出isMemberOfClass和isKindOfClass的實(shí)例方法和類方法底層實(shí)現(xiàn)

底層源碼

由上圖可知:

isMemberOfClass:

此處YYPerson繼承至NSObject

isMemberOfClass
打印結(jié)果

分析:

實(shí)例方法:因?yàn)橹皇呛?jiǎn)單的判斷方法調(diào)用者的類對(duì)象是否等于傳入的cls墩衙,所以[p1 isMemberOfClass:[NSObject class]] 為0凫碌,[p1 isMemberOfClass:[YYPerson class]]為1

類方法:是通過(guò)判斷object_getClass((id) self ) == cls邻吭,我們可知類方法中的self是類對(duì)象格嗅,所以是判斷元對(duì)象是否等于cls,很顯然YYPerson元對(duì)象不是NSObject類對(duì)象捏雌,也不等于YYPerson類對(duì)象跃赚,所以[YYPerson isMemberOfClass:[NSObject class]]為0,[YYPerson isMemberOfClass:[YYPerson class]]為0性湿。

補(bǔ)充:

object_getClass(id obj):此方法如果傳入的是instance對(duì)象纬傲,返回class對(duì)象。如果是class對(duì)象肤频,返回mate-class對(duì)象叹括。如果是meta-class對(duì)象,返回NSObject的meta-class對(duì)象

objc_getClass(const char *) :傳入字符串類名宵荒,返回對(duì)應(yīng)類對(duì)象

-(Class)class; + (Class) class; :?返回的是類對(duì)象

isKindOfClass:


isKindOfClass
打印結(jié)果

分析:

實(shí)例方法:實(shí)例方法中[self class],返回類對(duì)象汁雷,即tcls為類對(duì)象,首先會(huì)判斷tcls是否等于cls,如果不等于將繼續(xù)遍歷报咳,tcls supperClass指針繼續(xù)往上查找侠讯。

[p1 isKindOfClass:[NSObject class]]:

因?yàn)閠cls 為p1類對(duì)象,因?yàn)椴坏扔赱NSObject class],所以繼續(xù)遍歷(supperClass指針指向可以查看OC對(duì)象內(nèi)存布局這一節(jié))暑刃,找到[NSObject class]厢漩,此時(shí)相等所以打印1;

[p1 isKindOfClass:[YYPerson class]]:

因?yàn)閠cls 為p1類對(duì)象岩臣,等于[YYPerson class]所以打印1溜嗜;

類方法:類方法中object_getClass((id) self ),返回meta對(duì)象,即tcls為meta對(duì)象架谎,首先會(huì)判斷tcls是否等于cls,如果不等于將繼續(xù)遍歷炸宵,tcls supperClass指針繼續(xù)往上查找。

[YYPerson isKindOfClass:[NSObject class]]:

因?yàn)閠cls 為p1元對(duì)象狐树,因?yàn)椴坏扔赱NSObject class],所以繼續(xù)遍歷(supperClass指針指向可以查看OC對(duì)象內(nèi)存布局這一節(jié))焙压,找到NSObject 元對(duì)象,此時(shí)仍然不相等抑钟,所以繼續(xù)遍歷涯曲,由于Root ?Class(meta)的supperClass指針指向,Root Class(class),(可查看OC對(duì)象內(nèi)存布局指針指向圖在塔,或者注意點(diǎn)說(shuō)明) 所以NSObject 元對(duì)象的supperClass 最終指向NSObject類對(duì)象幻件,所以相等,打印1

[YYPerson isKindOfClass:[YYPerson class]]:

因?yàn)閠cls 為p1元對(duì)象蛔溃,因?yàn)椴坏扔赮YPerson 類對(duì)象绰沥,所以繼續(xù)遍歷找到NSObject 元對(duì)象篱蝇,此時(shí)仍然不相等,所以繼續(xù)遍歷徽曲,找到NSObject類對(duì)象仍然不相等零截,繼續(xù)遍歷,因?yàn)镹SObject的類對(duì)象supperClass指針為nil,所以不相等秃臣,打印0涧衙;

總結(jié)

isKindOfClass和isMemberOfClass:

兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類的成員, 兩者之間的區(qū)別是:isKindOfClass不但可以用來(lái)確定一個(gè)對(duì)象是否是一個(gè)類的成員奥此,也可以用來(lái)確定一個(gè)對(duì)象是否是派生自該類的類的成員 弧哎,而isMemberOfClass做不到后一點(diǎn)。

實(shí)例方法都是判斷對(duì)象的類對(duì)象是否==傳入?yún)?shù)稚虎,類方式都是判斷元對(duì)象是否== 傳入?yún)?shù)撤嫩。

但是isKindOfClass當(dāng)判斷不等于時(shí),還會(huì)去查找superClass指針指向的對(duì)象是否等于傳入?yún)?shù)蠢终。而isMemberOfClass不會(huì)序攘。因此isKindOfClass可以確定一個(gè)對(duì)象是否是一個(gè)類的成員,也可以用來(lái)確定一個(gè)對(duì)象是否是派生自該類的類的成員蜕径。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末两踏,一起剝皮案震驚了整個(gè)濱河市败京,隨后出現(xiàn)的幾起案子兜喻,更是在濱河造成了極大的恐慌,老刑警劉巖赡麦,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴皆,死亡現(xiàn)場(chǎng)離奇詭異蕊爵,居然都是意外死亡沃测,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門爬泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晶姊,“玉大人扒接,你說(shuō)我怎么就攤上這事∶茄茫” “怎么了钾怔?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蒙挑。 經(jīng)常有香客問(wèn)我宗侦,道長(zhǎng),這世上最難降的妖魔是什么忆蚀? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任矾利,我火速辦了婚禮姑裂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘男旗。我一直安慰自己舶斧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布察皇。 她就那樣靜靜地躺著捧毛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪让网。 梳的紋絲不亂的頭發(fā)上呀忧,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音溃睹,去河邊找鬼而账。 笑死,一個(gè)胖子當(dāng)著我的面吹牛因篇,可吹牛的內(nèi)容都是我干的泞辐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竞滓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咐吼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起商佑,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锯茄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后茶没,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肌幽,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年抓半,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喂急。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笛求,死狀恐怖廊移,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情探入,我是刑警寧澤狡孔,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站新症,受9級(jí)特大地震影響步氏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徒爹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一荚醒、第九天 我趴在偏房一處隱蔽的房頂上張望芋类。 院中可真熱鬧,春花似錦界阁、人聲如沸侯繁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贮竟。三九已至,卻和暖如春较剃,著一層夾襖步出監(jiān)牢的瞬間咕别,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工写穴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惰拱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓啊送,卻偏偏與公主長(zhǎng)得像偿短,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馋没,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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