查看runtime.h,我找到了结构objc_class的定义。
在各成员中,我们有: -
struct objc_method_list ** methodLists
我们肯定需要知道一个类的所有方法, 但是方法列表应该没问题,但为什么我们有“列表”?
为什么不只是一个清单?
此外,任何人都可以指定,是从该列表的超类部分继承的方法,还是通过指向父类结构的超类指针获取它们。
答案 0 :(得分:3)
以下是我对struct objc_method_list ** methodLists的详细调查:http://blog.csdn.net/jasonblog/article/details/7303618
简而言之,methodLists默认存储实例方法的SEL-IMP映射。在这种情况下,它只有一个列表。
正如'methodLists'所暗示的那样,它可以包含多个列表。如果向类添加类别,运行时系统将向methodLists中再插入一个列表,该列表指向类别的方法列表。
几个月前我试图回答这个问题,但当时由于网络问题,我放弃了我的答案。现在我再次见到它:)答案 1 :(得分:2)
目的在objc-class.m中解释,由Georg链接:
cls-> methodLists可以采用以下三种形式之一:
- NULL:该类没有方法。
- 非NULL,设置了CLS_NO_METHOD_ARRAY:cls-> methodLists points 单个方法列表,这是类唯一的方法列表。
- 非NULL,CLS_NO_METHOD_ARRAY清除:cls-> methodLists指向 方法列表指针数组。数组块的结尾 设置为-1。如果方法列表的实际数量较小 除此之外,数组的其余部分为NULL。
醇>附加类别以及添加和删除类可能会发生变化 班级名单的形式。另外,个别方法列表 固定时可以重新分配。
类最初被读作#1或#2。如果附加了类别 或者添加其他方法,该类更改为#3。一旦进入#3表格, 即使方法被删除,该类也永远不会降级为#1或#2。 使用objc_addClass添加的类最初是#1或#3。
因此简短的答案是“因为类别”。注入类别时,不是尝试将其方法列表与现有列表组合,而是将新条目添加到methodLists
,并设置为来自类别的列表。这可能使类别注入更快,因为它避免了(潜在的)大量重新分配和复制。