美文网首页
isKindOfClass和isMemberOfClass

isKindOfClass和isMemberOfClass

作者: gpylove | 来源:发表于2018-11-09 11:26 被阅读19次

定义:

isKindOfClass:确定一个对象是否是一个类的成员,或者是派生自该类的成员.

 isMemberOfClass:确定一个对象是否是当前类的成员.

小知识:

isMemberOfClass不能检测任何的类都是基于NSObject类这一事实,而isKindOfClass可以。

举例:

首先创建个Animal类基于NSObject,然后创建个Dog类基于Animal类

- (void)viewDidLoad {

    [super viewDidLoad];

    Animal*animal = [[Animal alloc]init];

    Dog*dog = [[Dog alloc]init];

    if([animal isKindOfClass:[Animalclass]]) {

        NSLog(@"animal iskinofclass Animal");

    }

    if([animal isMemberOfClass:[Animalclass]]) {

        NSLog(@"animal isMemberOfClass Animal");

    }

    if([animal isKindOfClass:[NSObjectclass]]) {

        NSLog(@"animal iskinofclass NSObject");

    }

    if([animal isMemberOfClass:[NSObjectclass]]) {

        NSLog(@"animal isMemberOfClass NSObject");

    }

    if([dog isKindOfClass:[Animalclass]]) {

        NSLog(@"dog isKindOfClass Animal");

    }

    if ([dog isMemberOfClass:[Animal class]]) {

        NSLog(@"dog isMemberOfClass Animal");

    }

    if([dog isKindOfClass:[NSObjectclass]]) {

        NSLog(@"dog isKindOfClass NSObject");

    }

    if ([dog isMemberOfClass:[NSObject class]]) {

        NSLog(@"dog isMemberOfClass NSObject");

    }

    if([dog isKindOfClass:[Dogclass]]) {

        NSLog(@"dog isKindOfClass Dog");

    }

    if ([dog isMemberOfClass:[Dog class]]) {

        NSLog(@"dog isMemberOfClass Dog");

    }

}

输出结果:

2018-11-09 11:00:59.239194+0800 OC-Swift[2450:68020] animal iskinofclass Animal

2018-11-09 11:00:59.239402+0800 OC-Swift[2450:68020] animal isMemberOfClass Animal

2018-11-09 11:00:59.239508+0800 OC-Swift[2450:68020] animal iskinofclass NSObject

2018-11-09 11:00:59.239619+0800 OC-Swift[2450:68020] dog isKindOfClass Animal

2018-11-09 11:00:59.239717+0800 OC-Swift[2450:68020] dog isKindOfClass NSObject

2018-11-09 11:00:59.239825+0800 OC-Swift[2450:68020] dog isKindOfClass Dog

2018-11-09 11:00:59.239916+0800 OC-Swift[2450:68020] dog isMemberOfClass Dog

后记:

        类簇实际上是Foundation framework框架下的一种设计模式,它管理了一组隐藏在公共接口下的私有类。在Cocoa中,许多类实际上是以类簇的方式实现的,即它们是一群隐藏在通用接口之下的与实现相关的类。例如创建NSString对象时,实际上获得的可能是NSLiteralString、NSCFString、NSSimpleCString、NSBallOfString或者其他未写入文档的与实现相关的对象。所以,请不要尝试去创建NSString、NSArray或NSDictionary的子类。如果必须添加或修改某个方法,可以使用类目的方式。

        对于类簇使用isMemberOfClass和isKindOfClass是不允许的,因为类簇是由抽象公共类管理的一组私有类,抽象公共类并不是真正的实例的父类,类簇中真正的类从属关系被隐藏了,所以使用isMemberOfClass和isKindOfClass结果可能不准确。

        如NSString、NSArray、NSDictionary、NSData、NSSet、NSMutableString、NSMutableArray、NSMutableDictionary、NSMutableData、NSMutableSet、NSNumber等都是以类簇方式实现的。

相关文章

网友评论

      本文标题:isKindOfClass和isMemberOfClass

      本文链接:https://www.haomeiwen.com/subject/ckpnxqtx.html