美文网首页iOS干货iOS 开发 iOS Developer
做题系列之1---oc中Class是个啥

做题系列之1---oc中Class是个啥

作者: 08878f627e79 | 来源:发表于2016-03-30 15:22 被阅读488次
    1. 先来看看熟悉的NSObject是个啥吧

       @interface NSObject <NSObject> {
            Class isa  OBJC_ISA_AVAILABILITY;
       }
      
    2. Class是个啥
      typedef struct objc_class *Class;

    3. objc_class是什么呢

    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    #endif
    
    } OBJC2_UNAVAILABLE;
    

    宏判断之间的字段就不一一解释了,网上一搜一大堆。
    从这里我们知道,Class是一个结构体,里面保存了类相关的信息。objc_class中本身也有一个Class的字段,即meta-class,指向的还是一个class。于是,网上的有了这样一张图:

    Class&MetaClass.001.jpg

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

    好,以上在网上均可以查到更加详细的资料。下面我们来做道题。

    BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
    BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
    

    输出的是什么呢?答案下节揭晓。

    头一次写博客。如有错误,请指正。如有建议,请提出。如果喜欢,请关注。

    相关文章

      网友评论

      • Steven_Wu:struct objc_class {
        Class isa OBJC_ISA_AVAILABILITY;

        #if !__OBJC2__
        Class super_class OBJC2_UNAVAILABLE;
        const char *name OBJC2_UNAVAILABLE;
        long version OBJC2_UNAVAILABLE;
        long info OBJC2_UNAVAILABLE;
        long instance_size OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
        struct objc_cache *cache OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
        #endif

        } OBJC2_UNAVAILABLE;

        这个OBJC2_UNAVAILABLE是说OBJC2.0以后不可用吗? 那么objc2.0以后runtime的struct objc_class定义是什么样的呢?
        08878f627e79:Objective-C 2.0的头文件没暴露出objc_class结构体更详细的设计。所以我们只能从1.0中窥探objc_class的定义。

      本文标题:做题系列之1---oc中Class是个啥

      本文链接:https://www.haomeiwen.com/subject/szaslttx.html