我读到在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
使用双指针**
,而不是对cache
或protocols
使用单指针*
是有原因的。
为什么它被称为methodLists
而不是methodList
?
我现在比较cache
、protocols
和methodLists
。
我认为苹果使用**
作为方法列表,而不是*
作为其他方法列表,这是出于技术原因,我想知道。
如果一个指针*
就足以列出方法列表,那么苹果为什么要使用双**
呢?
根据上面的帖子和本文,Apple设计带有双指针的methodLists
(与OBJC2.0
相同)的原因是,简单地说,双指针的结构对于在运行时将category
方法添加到类的方法列表中更快。
由于双指针用于方法列表的列表,因此考虑每个类别都有一个方法列表,并且当在运行时将一个或多个类别添加到类中时,可以简单地将指向类别方法列表的指针添加到具有指向每个列表/数组指针的指针的类methodLists
,而不是逐个添加方法。
我不确定我是否对此解释得足够清楚。