美文网首页
OC中类的结构

OC中类的结构

作者: wanmei世界 | 来源:发表于2017-04-06 13:46 被阅读115次

    NSObject

    @interface NSObject <NSObject> {
        Class isa;
    }
    

    其中Class是一个结构(struct)指针

    typedef struct objc_class *Class;
    
    其中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;
    

    怎么又有一个isa??这些isa到底是什么?之间有什么区别和联系

    objc_class中也有一个isa对象,这是因为一个 ObjC 类本身同时也是一个对象,为了处理类和对象的关系,runtime 库创建了一种叫做元类 (Meta Class) 的东西,类对象所属类型就叫做元类,而这个元类同时也是一个根元类 (root meta class) 的实例。所有的元类最终都指向根元类为其超类
    objc_ivar_list结构体存储着objc_ivar数组列表,而objc_ivar结构体存储了类的单个成员变量的信息;同理objc_method_list结构体存储着objc_method数组列表,而objc_method结构体存储了类的某个方法的信息。
    Cache为方法调用的性能进行优化,通俗地讲,每当实例对象接收到一个消息时,它不会直接在isa指向的类的方法列表中遍历查找能够响应消息的方法,因为这样效率太低了,而是优先在Cache中查找。Runtime 系统会把被调用的方法存到Cache中(理论上讲一个方法如果被调用,那么它有可能今后还会被调用),下次查找的时候效率更高。

    Ivar是一种代表类中实例变量的类型

    typedef struct objc_ivar *Ivar; 
    
    结构如下
    struct objc_ivar {
        char *ivar_name                                          OBJC2_UNAVAILABLE;
        char *ivar_type                                          OBJC2_UNAVAILABLE;
        int ivar_offset                                          OBJC2_UNAVAILABLE;
    #ifdef __LP64__
        int space                                                OBJC2_UNAVAILABLE;
    #endif
    }  
    
    

    相关文章

      网友评论

          本文标题:OC中类的结构

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