定义:
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等都是以类簇方式实现的。
网友评论