[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
【其实我个人觉得,从方法的名称就已经能猜出他们之间的区别了。^_^】
@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
相关文章推荐
- iOS使用自定义字体
- iOS 集成银联支付
- ios ffmpeg加字幕
- ffmpeg ios代码加字幕相关
- iOS ffmpeg视频合并加字幕
- iOS中几种定时器
- iOS开发实用工具——CornerStone配置SVN
- IOS使用正则表达式去掉html中的标签元素,获得纯文本
- iOS 阿拉伯数字转化为中文数字
- 分享一个仿ios风格的AlertDialog的实现
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
- iOS/OS X内存管理借助工具解决内存问题
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
- 苹果开发者账号注册申请流程
- iOS学习之iOS沙盒(sandbox)机制和文件操作(一)
- iOS 数组去重总结
- iOS 离屏渲染的研究
- IOS动态为类添加属性
- 40个国人iOS技术博客
- iOS基础框架