一般面试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