什么是结构objc_class的methodLists属性?

时间:2012-01-13 07:17:18

标签: objective-c objective-c-runtime

查看runtime.h,我找到了结构objc_class的定义。

在各成员中,我们有: -

struct objc_method_list ** methodLists

我们肯定需要知道一个类的所有方法, 但是方法列表应该没问题,但为什么我们有“列表”?

为什么不只是一个清单?

此外,任何人都可以指定,是从该列表的超类部分继承的方法,还是通过指向父类结构的超类指针获取它们。

2 个答案:

答案 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可以采用以下三种形式之一:

     
      
  1. NULL:该类没有方法。
  2.   
  3. 非NULL,设置了CLS_NO_METHOD_ARRAY:cls-> methodLists points   单个方法列表,这是类唯一的方法列表。
  4.   
  5. 非NULL,CLS_NO_METHOD_ARRAY清除:cls-> methodLists指向   方法列表指针数组。数组块的结尾   设置为-1。如果方法列表的实际数量较小   除此之外,数组的其余部分为NULL。
  6.         

    附加类别以及添加和删除类可能会发生变化   班级名单的形式。另外,个别方法列表   固定时可以重新分配。

         

    类最初被读作#1或#2。如果附加了类别   或者添加其他方法,该类更改为#3。一旦进入#3表格,   即使方法被删除,该类也永远不会降级为#1或#2。   使用objc_addClass添加的类最初是#1或#3。

因此简短的答案是“因为类别”。注入类别时,不是尝试将其方法列表与现有列表组合,而是将新条目添加到methodLists,并设置为来自类别的列表。这可能使类别注入更快,因为它避免了(潜在的)大量重新分配和复制。