当前位置:   article > 正文

iOS有关Runtime的一个面试题_ios 面试题 runtime

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1022526
推荐阅读
相关标签
  

闽ICP备14008679号