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

  • 相关阅读:
    Mysql 中的MVCC原理,undo日志的依赖
    Innodb 实现高并发、redo/undo MVCC原理
    Django restful 规范
    TCP 原理
    HTTPS建立连接的过程
    HTTP协议,Http 常用状态码
    SQL注入
    Mysql 索引问题集锦
    Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化
    归并排序Python 实现
  • 原文地址:https://www.cnblogs.com/sea-star3/p/5301061.html
Copyright © 2011-2022 走看看