objectivec-为什么苹果在iOS运行时对类类型结构中的方法列表使用双指针



我读到在iOS运行时,类变成了struct(其他oc对象也是如此),如下所示:

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;

在上面的结构中,有这样一个:

struct objc_method_list **methodLists   OBJC2_UNAVAILABLE;  

我是C的新手,我不太明白OC为什么使用指针对指针**作为方法列表。

为什么它不使用与缓存相同的结构:

struct objc_cache *cache                OBJC2_UNAVAILABLE;

因为缓存还包含以前使用的方法。

我认为苹果对method lists使用双指针**,而不是对cacheprotocols使用单指针*是有原因的。

为什么它被称为methodLists而不是methodList

我现在比较cacheprotocolsmethodLists

我认为苹果使用**作为方法列表,而不是*作为其他方法列表,这是出于技术原因,我想知道。

如果一个指针*就足以列出方法列表,那么苹果为什么要使用双**呢?

类似的问题:什么是methodLists结构objclass的属性?

根据上面的帖子和本文,Apple设计带有双指针的methodLists(与OBJC2.0相同)的原因是,简单地说,双指针的结构对于在运行时将category方法添加到类的方法列表中更快。

由于双指针用于方法列表的列表,因此考虑每个类别都有一个方法列表,并且当在运行时将一个或多个类别添加到类中时,可以简单地将指向类别方法列表的指针添加到具有指向每个列表/数组指针的指针的类methodLists,而不是逐个添加方法。

我不确定我是否对此解释得足够清楚。

最新更新