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不相等

  • 相关阅读:
    MyBatis---集合查询(一对多)
    MyBatis---简单关系查询
    MyBatis---简介
    MyBatis---简单增删改查的带事物的例子
    log4j.properties配置文件详解
    Hibernate---实体类注释简介
    Hibernate---数据操作示例BY实体类注释
    Hibernate---数据操作示例BY实体映射文件
    JDBC---java与数据库中数据类型的对应关系
    Hibernate---session
  • 原文地址:https://www.cnblogs.com/sea-star3/p/5301061.html
Copyright © 2011-2022 走看看