为什么category不能添加成员变量却能添加方法?

 

iOS Category详解

 

objc_class结构体的定义如下:

`struct objc_class {`

`Class isa  OBJC_ISA_AVAILABILITY;`

`#if !__OBJC2__`

`Class super_class                       OBJC2_UNAVAILABLE;  ``// 父类`

`const char *name                        OBJC2_UNAVAILABLE;  ``// 类名`

`long version                            OBJC2_UNAVAILABLE;  ``// 类的版本信息,默认为0`

`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;`

 

在上面的objc_class结构体中,ivars是objc_ivar_list(成员变量列表)指针;methodLists是指向objc_method_list指针的指针。在Runtime中,objc_class结构体大小是固定的,不可能往这个结构体中添加数据,只能修改。所以ivars指向的是一个固定区域,只能修改成员变量值,不能增加成员变量个数。methodList是一个二维数组,所以可以修改*methodLists的值来增加成员方法,虽没办法扩展methodLists指向的内存区域,却可以改变这个内存区域的值(存储的是指针)。因此,可以动态添加方法,不能添加成员变量。

posted on 2020-04-17 12:43  鬼手渔翁  阅读(1)  评论(0)    收藏  举报

导航