您的位置:首页 > 移动开发 > IOS开发

[iOS]isKindOfClass、isMemberOfClass、isSubclassOfClass

2016-03-17 13:18 615 查看
最近招聘了一段时间,有些面试者我会提到 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: