为什么methodLists是指向objc_class中指针的指针

时间:2014-12-20 06:35:49

标签: ios objective-c objective-c-runtime

方法列表和协议都是链表, protocols是一个指针,但methodLists是一个指向指针的指针,为什么?

ocjc_class objc_method_list objc_protocol_list

1 个答案:

答案 0 :(得分:3)

这是一个实现细节,它与Objective-C的历史和向类动态添加方法的能力有关。

具体来说,如果查看method_list条目的内容,您会发现这些方法被分解为集合,其中每个集合包含对象上特定类别的所有方法。即如果你的应用程序要使用五种方法在UIView上定义一个类别(不要这样做 - 设计不好),那么你会发现在单个objc_method_list中将这五种方法添加到method_list的末尾(这就是为什么method_list条目是指针对齐且可变大小)。

这也扩展到方法的动态添加。无需将一堆数据复制到现有方法数据结构的新分配副本中。相反,运行时可以只分配一个objc_method_list并将其推送到链表的末尾(或者在头部 - 实现细节)。