zoukankan      html  css  js  c++  java
  • 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不相等

  • 相关阅读:
    php类自动加载
    tp5自定义分页参数
    cURL error 60: SSL certificate problem...
    ajax动态刷新的元素,导致绑定事件失效
    thinkphp5省市区三级联动例子
    restful状态码常用
    mysql的like子句
    mysql官方的测试数据库employees超30万的数据,安装方法介绍
    Aes加解密,php
    php5.6,Ajax报错,Warning: Cannot modify header information
  • 原文地址:https://www.cnblogs.com/sea-star3/p/5301061.html
Copyright © 2011-2022 走看看