推广

isMemberOfClass和isKindOfClass区别

iseeyu2年前 (2024-02-21)推广148

这图真重要啊

注意(很关键):

  • NSObject的元类的isa指针指向自己
  • NSObject的元类的superClass指向NSObject
  • **NSObject的superClassnil

源码解析

isMemberOfClass 只比较一次
//类方法
+ (BOOL)isMemberOfClass:(Class)cls {
    // 获取类的元类(类的isa指针指向其元类),与 传入类对比
    return self->ISA() == cls;
}
//实例方法
- (BOOL)isMemberOfClass:(Class)cls {
    //获取对象的类,与 传入类对比
    return [self class] == cls;
}
isKindOfClass 有可能会通过循环查找superClass比较多次
//类方法
+ (BOOL)isKindOfClass:(Class)cls {
//第一次获取类的元类(类的isa指针指向其元类),与 传入类对比;
//如果NO,循环与元类的superClass比较(NSObject的元类的superClass是NSObject,NSObject的superClass是nil)
    for (Class tcls = self->ISA(); tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}

//对象方法
- (BOOL)isKindOfClass:(Class)cls {
//第一次是获取对象类 与 传入类对比,如果不相等,后续对比是继续获取上次 类的父类 与传入类进行对比
    for (Class tcls = [self class]; tcls; tcls = tcls->getSuperclass()) {
        if (tcls == cls) return YES;
    }
    return NO;
}

面试题

类方法比较:
BOOL res1=  [[NSObject class]isMemberOfClass:[NSObject class]];

结果:NO,NSObject的元类与NSOject类比较(NSObject的isa指向其元类)

BOOL res2 =  [[Person class]isMemberOfClass:[Person class]];

结果:NO,Person的元类与Person类比较(同上,元类与类不同)

BOOL res3 = [[NSObject class]isKindOfClass:[NSObject class]];

结果:YES

  • 第一次NSObject的元类与NSObject类比较,返回NO,所以循环比较superClass
  • 第二次NSObject的元类的superClass为NSObject类,返回YES
BOOL res4 =[[Person class]isKindOfClass:[Person class]];

结果:NO

  • 第一次Person的元类与Person类比较,返回NO
  • 第二次Person的元类的superClass,即NSObject的元类与Person类比较,返回NO
  • 第三次NSObject类与Person类比较,返回NO
  • 第四次nil与Person类比较,返回NO,结束循环
对象方法比较:
BOOL res5 =  [[NSObject alloc]isMemberOfClass:[NSObject class]];
BOOL res6 =  [[Person alloc]isMemberOfClass:[Person class]];
BOOL res7 = [[NSObject alloc]isKindOfClass:[NSObject class]];
BOOL res8 =[[Person alloc]isKindOfClass:[Person class]];

结果:YES,[self class]与其传入类比较,都相同,isKindOfClass只比较一次就返回了YES。

BOOL res9 =  [[Person alloc]isMemberOfClass:[NSObject class]];

结果:NO,Person类与NSObject类比较

BOOL res10 =  [[Person alloc]isKindOfClass:[NSObject class]];;

结果:YES

  • 第一次Person类与NSObject类比较,返回NO
  • 第二次Person类的superClass,即NSObject类与NSObject类比较,返回YES

总结

  • isMemberOfClass只比较一次,而isKindOfClass有可能比较多次
  • 类方法找到isa指针指向的类进行比较,实例方法直接[self class]比较
  • isKindOfClass循环查找superClass,看上面那张superClass指向图吧,多说无益

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56666.html

相关文章

竞品分析报告:斗鱼VS虎牙

竞品分析报告:斗鱼VS虎牙

  直播是一群孤独者的狂欢,虽然每个用户都在不同的地方,从事不同的工作,但通过直播这个平台可以将大家聚集起来。让大家同时参与到一场演出中来,直播惊人的流量以及丰厚的回报让相应的产品接连产生,本文将带大家了解其中知名的两款。 直播作为的当下最火热,参与人数最多的视频形式之一体现...

淘宝超级推荐多久有效果(淘宝的超级推荐有用吗)

淘宝超级推荐多久有效果(淘宝的超级推荐有用吗)

超级推荐只是推广引流的工具,投放效果好坏需要结合产品的流量承接能力和投放渠道的选择。...

关于财富的底层思维,升级你的赚钱能力!「合集已完结」

本合集中,大墨总结了“高财商人士的7种”。它们是:1.做金钱的主人先拥有富人的底层思维,才能拥有财富2.时间的价值富人都拥有的底层思维:衡量时间的价值3.有耐心的长期主义者关于长期主义你要知道这三件事4.财富的“游戏”思维财富是个游戏场,你懂游戏规则吗?5.和“先生”做朋友...

爆款引流活动的3大核心要点!

爆款引流活动的3大核心要点!

  今天我会结合一些实际案例和大家分享下如何设计一场增长活动。 一、两个环节帮你提高用户参与活动的意愿 想要提高用户参与活动的意愿,就要最大限度地抓住用户的心理,这里我们可以从以下两个环节切入: 1、第一个环节是初次接触: 无论是线上还是线下活动,我们只有在用户初次接触...

国外专家纵议ASO,他们是如何做搜索优化的?

国外专家纵议ASO,他们是如何做搜索优化的?

如何做好一款手游在应用商店的搜索优化(ASO)?在8月份举行的旧金山Casual Connect峰会期间,GamesBeat首席作者Dean Takahashi主持了一场沙龙,并邀请到四位熟悉ASO领域的嘉宾,围绕这个话题进行探讨。四位嘉宾分别是YellowHead营销高级副总裁 Yonatan D...

从入门到实战!腾讯高手总结的C4D自学必备指南。

从入门到实战!腾讯高手总结的C4D自学必备指南。

导语 近年三维表现已经越来越多的融入到各种商业设计当中,在电商、品牌、UI、影视等各个领域都有广泛的运用。其中一个关键因素是 C4D 这款软件的出现,大大降低了 3D 设计的学习门槛。 C4D 相对于专业性更强、功能较为复杂的 3DMax、Maya、ZBrush 等软件,界面更加简洁友...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片