最近招聘了一段时间,有些面试者我会提到 isKindOfClass 和 isMemberOfClass 的区别和使用场景。来的人很少有能答对的,我觉得这是很基础的东西,所以在这里简单的用代码加说明的形式列出来。
【其实我个人觉得,从方法的名称就已经能猜出他们之间的区别了。^_^】
@interface SuperClass : NSObject
@end
@implementation SuperClass
@end
@interface SubClass : SuperClass
@end
@implementation SubClass
+ (void)load {
// 测试代码
SubClass *objSub = [[SubClass alloc] init];
SuperClass *objSuper = [[SuperClass alloc] init];
NSLog(@"isKindOfClass Test");
NSLog(@"%@", [objSub isKindOfClass:[SuperClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [objSub isKindOfClass:[SubClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [objSuper isKindOfClass:[SuperClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [objSuper isKindOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SubClass class] isKindOfClass:[SuperClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SubClass class] isKindOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SuperClass class] isKindOfClass:[SuperClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SuperClass class] isKindOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"isMemberOfClass Test");
NSLog(@"%@", [objSub isMemberOfClass:[SuperClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [objSub isMemberOfClass:[SubClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [objSuper isMemberOfClass:[SuperClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [objSuper isMemberOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SubClass class] isMemberOfClass:[SuperClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SubClass class] isMemberOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SuperClass class] isMemberOfClass:[SuperClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"%@", [[SuperClass class] isMemberOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
NSLog(@"isKindOfClass Test");
// NSLog(@"%@", [objSub isSubclassOfClass:[SuperClass class]] ? @"YES" : @"NO"); // Error
// NSLog(@"%@", [objSub isSubclassOfClass:[SubClass class]] ? @"YES" : @"NO"); // Error
// NSLog(@"%@", [objSuper isSubclassOfClass:[SuperClass class]] ? @"YES" : @"NO"); // Error
// NSLog(@"%@", [objSuper isSubclassOfClass:[SubClass class]] ? @"YES" : @"NO"); // Error
NSLog(@"%@", [[SubClass class] isSubclassOfClass:[SuperClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [[SubClass class] isSubclassOfClass:[SubClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [[SuperClass class] isSubclassOfClass:[SuperClass class]] ? @"YES" : @"NO"); // YES
NSLog(@"%@", [[SuperClass class] isSubclassOfClass:[SubClass class]] ? @"YES" : @"NO"); // NO
}
/*
结论:
1. isKindOfClass 用于类的实例对象,判断该对象的类是某类或者其子类
2. isMemberOfClass 用于类的实例对象,判断该对象的类是某类
3. isSubclassOfClass 用于类对象,判断该类是某类或者其子类
*/
@end