久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

        關注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術干貨  > 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只能判斷對象是否是當前類的實例對象。

        isMemberOfClass和isKindOfClass的應用舉例:

        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對象的指針,你不應該使用這個方法來查看數(shù)組是否可變,如下面的代碼所示:

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

        如果您在代碼中使用這樣的結(jié)構(gòu),您可能會認為修改實際上不應該修改的對象是可以的。這樣做可能會給其他希望對象保持不變的代碼帶來問題。如果接收對象是一個類對象,如果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對象都是如此做橋接的)??傊畬τ陬惔氐呐袛嘁斏?。

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

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

        聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
        免費領取
        今日已有369人領取成功
        劉同學 138****2860 剛剛成功領取
        王同學 131****2015 剛剛成功領取
        張同學 133****4652 剛剛成功領取
        李同學 135****8607 剛剛成功領取
        楊同學 132****5667 剛剛成功領取
        岳同學 134****6652 剛剛成功領取
        梁同學 157****2950 剛剛成功領取
        劉同學 189****1015 剛剛成功領取
        張同學 155****4678 剛剛成功領取
        鄒同學 139****2907 剛剛成功領取
        董同學 138****2867 剛剛成功領取
        周同學 136****3602 剛剛成功領取
        相關推薦HOT
        萝北县| 革吉县| 石棉县| 五原县| 万州区| 香河县| 宁阳县| 扬中市| 长春市| 湘潭市| 上饶市| 富平县| 建德市| 和静县| 泰顺县| 新宁县| 扎兰屯市| 彰武县| 河津市| 浦江县| 莱芜市| 嫩江县| 体育| 贡觉县| 武陟县| 土默特右旗| 德清县| 花莲市| 莱西市| 鄂尔多斯市| 金川县| 右玉县| 任丘市| 榆树市| 宜城市| 阿城市| 集贤县| 平南县| 海兴县| 和顺县| 大宁县|