美文网首页
OC 内省方法结合面试题分析

OC 内省方法结合面试题分析

作者: AssassinrKiller | 来源:发表于2020-09-15 00:30 被阅读0次

1.oc中的内省方法

//类调用
+ (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
//对象调用
- (BOOL)isKindOfClass:(Class)cls {
    for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
        if (tcls == cls) return YES;
    }
    return NO;
}
//类调用
+ (BOOL)isMemberOfClass:(Class)cls {
    return self->ISA() == cls;
}
//对象调用
- (BOOL)isMemberOfClass:(Class)cls {
    return [self class] == cls;
}

结合面试提分析结果

//面试题
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];       
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];   
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];               
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]]; 
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4); 

       
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];       
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]]; 
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];     
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];  
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);

//打印结果为
 re1 :1
 re2 :0
 re3 :0
 re4 :0

 re5 :1
 re6 :1
 re7 :1
 re8 :1

问题 1. [(id)[NSObject class] isKindOfClass:[NSObject class]] 的打印结果为 1 ?

  • 首先 [NSObject class] 调用 +isKindOfClass 第一步 clsNSObject , 根据 tcls=self->ISA() 得到 NSObject元类 ,此时 tcls != cls 循环继续, 更新 tcls = tcls->superclass , NSObject元类 的父类正好是 NSObject 正好满足 tcls == cls 所以返回 YES 打印结果为 1

问题2. [(id)[NSObject class] isMemberOfClass:[NSObject class]] 的结果为 0 ?

  • 首先 [NSObject class] 调用 + isMemberOfClass 第一步 clsNSObject , self->ISA()所以应该是NSObject元类 ,此时 NSObject 不等于 NSObject元类 所以返回 NO 打印结果为 0

问题3. [(id)[LGPerson class] isKindOfClass:[LGPerson class]] 的结果为 0 ?

  • 首先 [LGPerson class] 调用 + isKindOfClass 第一步 clsLGPerson , tcls = self->ISA()所以应该是LGPerson元类 ,此时 LGPerson 不等于 LGPerson元类 继续更新 tcls = tcls->superclass 此时 tclsNSObject元类 对比一下也不相等,再继续更新 tclsNSObject 当然 LGPerson != NSObject 直到 superclass = nil 不满足循环条件 return NO 所以打印结果为 0

问题4. [(id)[LGPerson class] isMemberOfClass:[LGPerson class]] 的结果为 0 ?

  • 首先 clsLGPerson , self->ISA()所以应该是LGPerson元类 ,此时两个结果不相等所以返回 NO 打印结果为 0

问题6 和 8 都是调用 - isMemberOfClass 实例方法, 对应源码应该[self class] == cls 很好理解,都是返回 1
问题 5 和 7 都是调用 - isKindOfClass 实例方法, cls 是当前类 tcls = [self class] 得到的结果也是当前类, 所以判断都是相等的结果打印为 1

相关文章

网友评论

      本文标题:OC 内省方法结合面试题分析

      本文链接:https://www.haomeiwen.com/subject/xtctyktx.html