• class&meta class


    http://chun.tips

    当我们发送一个消息给一个NSObject对象时,这条消息会在对象的类的方法列表里查找
    当我们发送一个消息给一个类时,这条消息会在类的Meta Class的方法列表里查找

    而 Meta Class本身也是一个Class,它跟其他Class一样也有自己的 isa 和 super_class 指针

    每个Class都有一个isa指针指向一个唯一的Meta Class
    每一个Meta Class的isa指针都指向最上层的Meta Class(图中的NSObject的Meta Class)
    最上层的Meta Class的isa指针指向自己,形成一个回路
    每一个Meta Class的super class指针指向它原本Class的 Super Class的Meta Class。但是最上层的Meta Class的 Super Class指向NSObject Class本身
    最上层的NSObject Class的super class指向 nil

    - (BOOL)isKindOf:aClass
    {
    Class cls;
    for (cls = isa; cls; cls = cls->superclass)
    if (cls == (Class)aClass)
    return YES;
    return NO;
    }

    当 NSObject Class对象第一次进行比较时,得到它的isa为 NSObject的Meta Class, 这个时候 NSObject Meta Class 和 NSObject Class不相等。
    然后取NSObject 的Meta Class 的Super class,这个时候又变成了 NSObject Class, 所以返回相等

    - (BOOL)isMemberOf:aClass
    {
    return isa == (Class)aClass;
    }
    综上所述,当前的 isa 指向 NSObject 的 Meta Class, 所以和 NSObject Class不相等。

    Sark Class 的isa指向的是 Sark的Meta Class,和Sark Class不相等
    Sark Meta Class的super class 指向的是 NSObject Meta Class, 和 Sark Class不相等
    NSObject Meta Class的 super class 指向 NSObject Class,和 Sark Class 不相等
    NSObject Class 的super class 指向 nil, 和 Sark Class不相等

  • 相关阅读:
    GZDBHelper C#.NET开源的数据库访问组件
    判断页面是否是静态页面
    Web应用程序dll获取当前程序集路径问题
    webAPI 上传文件
    解决.Net Core3.0 修改cshtml代码之后必须重新生成才可以看到效果
    .net core使用LESS
    test
    JS实现线程锁(Promise),NodeJS并发锁处理
    参考护照编码实现算法JS生成带字母有序编码
    centos7防火墙开放端口与关闭防火墙
  • 原文地址:https://www.cnblogs.com/sea-star3/p/5301061.html
Copyright © 2020-2023  润新知