iOS有关Runtime的一个面试题

一般面试Runtime时,都会问这样一个问题:
面试题

  • 首先1/2/3/4均是对isKindOfClass,isMemberOfClass类方法的调用

      + (BOOL)isKindOfClass:(Class)cls {
      	for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
      		if (tcls == cls) return YES;
      	}
      	return NO;
      }
      /**
      分析rel1:object_getClass((id)self)获取到NSObject的元类
      然后通过循环找元类的父类,根据isa走位图,NSObject的元类的父类是NSObject类
      所以,循环到最后,tcls==cls返回YES,打印结果为1!
    
      分析re3:object_getClass((id)self)获取到WMPerson的元类,与WMPerson类比较,则为NO,
      循环获取到WMPerson元类的父类以及循环到最后得到的根源类
      再与WMPerson比较,则为NO,
      根源类的父类会找到NSObject类,那么NSObject类与WMPerson类不相等,返回NO,打印结果0.
      */
      
      + (BOOL)isMemberOfClass:(Class)cls {
      	//元类与类的比较
      	return object_getClass((id)self) == cls;
      }
      /*
      分析rel2: object_getClass((id)self)获取到NSObject的元类
      元类≠NSObject类,返回NO,打印结果0!
    
      分析rel4:object_getClass((id)self)获取到WMPerson的元类
      WMPerson的元类≠WMPerson类,返回NO,打印结果0.
      */
    

    打印结果为:rel1 : 1 rel2 : 0 rel3 : 0 rel4 : 0

  • 5/6/7/8均是对象方法的调用

      - (BOOL)isKindOfClass:(Class)cls {
      	for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
      		if (tcls == cls) return YES;
      	}
      	return NO;
      }
      /**
      分析rel5: [self class]获取到NSObject类,与NSObject类相比较得YES,打印1!
    
      分析rel7: [self class]获取到WMPerson类,与WMPerson类相比较得YES,打印1!
      */
      
      - (BOOL)isMemberOfClass:(Class)cls {
      	//类与类的比较
      	return [self class] == cls;
      }
      /**
      分析rel6:[self class]获取到NSObject类, 与NSObject类相比较得YES,打印1!
    
      分析rel8:[self class]获取到WMPerson类,与WMPerson类相比较得YES,打印1!
      */
    

    打印结果: rel5 : 1 rel6 : 1 rel7 : 1 rel8 : 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值