赞
踩
一般面试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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。