国产一区二区精品-国产一区二区精品久-国产一区二区精品久久-国产一区二区精品久久91-免费毛片播放-免费毛片基地

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

手機站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > isKindOfClass、isMemberOfClass 作用分別是什么?

isKindOfClass、isMemberOfClass 作用分別是什么?

來源:千鋒教育
發(fā)布人:xqq
時間: 2023-10-12 21:24:38 1697117078

一、isKindOfClass、isMemberOfClass 作用分別是什么

isKindOfClass方法的作用是判斷一個對象是否為指定類或指定類的子類的實例。如果是,返回YES;否則,返回NO。該方法會遞歸地向上檢查對象所屬的父類,直到父類為根類NSObject(或派生自NSObject的類)為止。isMemberOfClass方法的作用是判斷一個對象是否為指定類的實例。如果是,返回YES;否則,返回NO。

isKindOfClass:

類方法:元類 –> 根元類 –> 根類 –> nil 與 傳入類的對比實例方法:對象的類 –> 父類 –> 根類 –> nil 與 傳入類的對比

isMemberOfClass

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

不同的指向:

isa的指向:對象的 isa 指向類; 類的 isa 指向元類;元類的 isa 指向根元類;根元類的 isa 指向自己。類的superclass的指向:類的 superclass 指向父類, 父類的 superclass 指向根類 ,根類的superclass 指向nil。元類的superclass的指向:元類的 superclass 指向父類的元類,父元類的 superclass 指向根類的元類根元類的 superclass 指向根類,根類的 superclass 指向 nil。

和isKindOfClass不同的是,isMemberOfClass只會檢查對象的實際類型是否與指定類相同,不會向上檢查其父類。

二、isKindOfClass和isMemberOfClass的區(qū)別

首先看看兩個方法的蘋果官方解釋:

isKindOfClass:Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required)

這個方法用來判斷一個對象是否是指定類或者某個從該類繼承類的實例對象。

isMemberOfClass:Returns a Boolean value that indicates whether the receiver is an instance of a given class. (required)

這個方法用來判斷一個對象是否是指定類的實例對象。

兩者區(qū)別

isKindOfClass 可以判斷某對象是否是某個類的實例對象,這個類和這個類的繼承類都可以判斷;isMemberOfClass只能判斷對象是否是當(dāng)前類的實例對象。

isMemberOfClass和isKindOfClass的應(yīng)用舉例:

UIScrollView *scrollView = [[UIScrollView alloc] init];if ([scrollView isKindOfClass:[UIView class]]) {    NSLog(@"scrollView is isKindOfClass UIView");}if ([scrollView isKindOfClass:[UIScrollView class]]) {    NSLog(@"scrollView is isKindOfClass UIScrollView");}if ([scrollView isMemberOfClass:[UIView class]]) {    NSLog(@"scrollView is isMemberOfClass UIView");}if ([scrollView isMemberOfClass:[UIScrollView class]]) {    NSLog(@"scrollView isMemberOfClass UIScrollView");}

輸出結(jié)果:

scrollView is isKindOfClass UIView
scrollView is isKindOfClass UIScrollView
scrollView isMemberOfClass UIScrollView

另外需要特別注意的是NSArray、NSMutableArray這樣的類,蘋果官方文檔有這樣一段描述:

在類集群表示的對象上使用此方法時要小心。由于類集群的性質(zhì),您返回的對象可能并不總是您所期望的類型。如果您調(diào)用返回類集群的方法,則該方法返回的確切類型是您可以對該對象執(zhí)行的操作的優(yōu)異指示器。例如,如果一個方法返回一個指向NSArray對象的指針,你不應(yīng)該使用這個方法來查看數(shù)組是否可變,如下面的代碼所示:

// DO NOT DO THIS!if ([myArray isKindOfClass:[NSMutableArray class]]){    // Modify the object}

如果您在代碼中使用這樣的結(jié)構(gòu),您可能會認(rèn)為修改實際上不應(yīng)該修改的對象是可以的。這樣做可能會給其他希望對象保持不變的代碼帶來問題。如果接收對象是一個類對象,如果aClass是相同類型的class對象,此方法返回YES,否則返回NO。

測試結(jié)果:

NSArray *testArray = [[NSArray alloc] init];NSMutableArray *testArray2 = [[NSMutableArray alloc] init];if ([testArray isKindOfClass:[NSArray class]]) {    NSLog(@"testArray isKindOfClass of NSArray");}if ([testArray isMemberOfClass:[NSArray class]]) {    NSLog(@"testArray isMemberOfClass of NSArray");}if ([testArray2 isKindOfClass:[NSMutableArray class]]) {    NSLog(@"testArray2 isKindOfClass of NSMutableArray");}if ([testArray2 isMemberOfClass:[NSMutableArray class]]) {    NSLog(@"testArray2 isMemberOfClass of NSMutableArray");}

控制臺輸出:

testArray isKindOfClass of NSArray
testArray2 isKindOfClass of NSMutableArray

各種查詢得出的結(jié)論是:NSArray、NSMutableArray屬于類簇,使用isMemberOfClass不能取到正確的結(jié)果。原因是:由于類簇的性質(zhì),這類對象實際返回的實例有不確定性。NSArray對象可能會在運行時發(fā)現(xiàn)其實運作的是NSCFArray(來自Core Foundation框架(C語言的實現(xiàn)版本),很多Cocoa對象都是如此做橋接的)。總之對于類簇的判斷要謹(jǐn)慎。

延伸閱讀1:isKindOfClass、isMemberOfClass的用法

不管是isKindOfClass還是isMemberOfClass,在類對象調(diào)用時,都是與調(diào)用者的元類對象與傳入?yún)?shù)進(jìn)行判斷,在實例對象調(diào)用時,不管是isKindOfClass還是isMemberOfClass,都是與調(diào)用者的類對象與傳入?yún)?shù)進(jìn)行判斷。isKindOfClass具有繼承關(guān)系,會沿著superclass遍歷;isMemberOfClass,則沒有繼承關(guān)系,只會判斷一次。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
linux有什么優(yōu)點?

1、開源Linux的主要優(yōu)點之一是它是一個開放源代碼的操作系統(tǒng),即每個人都可以輕松獲得其源代碼。任何有編程能力的人都可以出于任何目的貢獻(xiàn),修...詳情>>

2023-10-12 23:08:52
Python特點及應(yīng)用?

一、Python的特點Python是一種高級編程語言,由Guido van Rossum于上世紀(jì)90年代初開發(fā),它具有以下特點:1、語法簡潔易讀Python使用縮進(jìn)來表示...詳情>>

2023-10-12 23:00:52
為什么Oracle收購MySQL后仍保證其開源免費?

一、為什么Oracle收購MySQL后仍保證其開源免費MySQL在收購前一直使用GPL許可分發(fā),而GPL許可是不可撤銷的,這意味著至少被收購之前的最后一個Re...詳情>>

2023-10-12 22:52:49
為什么MySQL對SQL標(biāo)準(zhǔn)中很多基本用法都不支持?

一、為什么MySQL對SQL標(biāo)準(zhǔn)中很多基本用法都不支持因為當(dāng)年,在微軟.net技術(shù)棧下開發(fā)應(yīng)用,用的就是sql server數(shù)據(jù)庫。在特性方面,不僅緊跟sql...詳情>>

2023-10-12 22:49:20
數(shù)據(jù)庫與Microsoft Excel有什么區(qū)別?

一、數(shù)據(jù)庫與Microsoft Excel的區(qū)別1、結(jié)構(gòu)不同excel即是電子數(shù)據(jù)表,顯示由一系列行與列構(gòu)成的網(wǎng)格。。其中的單元格可以用于存放數(shù)值、計算式...詳情>>

2023-10-12 22:47:09