当前位置:   article > 正文

iOS Runtime面试题(代码题 二 )_ios代码题

ios代码题

题目二:以下的代码会输出什么结果?

  1. @interface Sark : NSObject
  2. @end
  3. @implementation Sark
  4. @end
  5. int main(int argc, const char * argv[]) {
  6. @autoreleasepool {
  7. // insert code here...
  8. NSLog(@"%@", [NSObject class]);
  9. NSLog(@"%@", [Sark class]);
  10. BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
  11. BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
  12. BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
  13. BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
  14. NSLog(@"%d--%d--%d--%d", res1, res2, res3, res4);
  15. }
  16. return 0;
  17. }

结果: 1--0--0--0

分析:

首先,我们先去查看一下题干中两个方法的源码:

  1. - (BOOL)isMemberOfClass:(Class)cls {
  2. return [self class] == cls;
  3. }
  4. - (BOOL)isKindOfClass:(Class)cls {
  5. for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
  6. if (tcls == cls) return YES;
  7. }
  8. return NO;
  9. }

可以得知:

  • isKindOfClass 的执行过程是拿到自己的 isa 指针和自己比较,若不等则继续取 isa 指针所指的 super class 进行比较。如此循环。
  • isMemberOfClass 是拿到自己的 isa 指针和自己比较,是否相等。
  1. [NSObject class] 执行完之后调用 isKindOfClass,第一次判断先判断 NSObject 和 NSObject 的 meta class 是否相等,之前讲到 meta class 的时候放了一张很详细的图,从图上我们也可以看出,NSObject 的 meta class 与本身不等。接着第二次循环判断 NSObject 与meta class 的 superclass 是否相等。还是从那张图上面我们可以看到:Root class(meta) 的 superclass 就是 Root class(class),也就是 NSObject 本身。所以第二次循环相等,于是第一行 res1 输出应该为YES。

  2. isa 指向 NSObject 的 Meta Class,所以和 NSObject Class不相等。

  3. [Sark class] 执行完之后调用 isKindOfClass,第一次 for 循环,Sark 的 Meta Class 与 [Sark class] 不等,第二次 for 循环,Sark Meta Class 的 super class 指向的是 NSObject Meta Class, 和 Sark Class 不相等。第三次 for 循环,NSObject Meta Class 的 super class 指向的是 NSObject Class,和 Sark Class 不相等。第四次循环,NSObject Class 的super class 指向 nil, 和 Sark Class 不相等。第四次循环之后,退出循环,所以第三行的 res3 输出为 NO。

  4. isa 指向 Sark 的 Meta Class,和 Sark Class 也不等。

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

闽ICP备14008679号