[iOS]isKindOfClass、isMemberOfClass、isSubclassOfClass


最近招聘了一段时间,有些面试者我会提到 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值