OC中类的结构

2017-04-06  本文已影响115人  wanmei世界

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
}  

上一篇下一篇

猜你喜欢

热点阅读