类别的定义objc_category
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceProperties;
};
需要注意的是里面,name是指所依附的类的名称。category是在runtime阶段通过name找到对应的类对象。
instanceProperties:表示Category里所有的properties,这就是我们可以通过objc_setAssociatedObject和objc_getAssociatedObject增加实例变量的原因,不过这个和一般的实例变量是不一样的。
这里可以辨析一下 属性和成员变量的区别联系。
成员变量 是用于类内部使用,无需与外界交互。成员变量不会生成set、get方法。
实例变量 如果变量的数据类型是一个类则称这个变量为实例变量。实例变量是成员变量的一种特殊情况。
属性 的本质是方法。在类内部会自动生成对应的”_xxx“成员变量。并且创建setter/getter方法。在类别中由于有上面提到的instanceProperties。可以添加objc_setAssociatedObject和objc_getAssociatedObject增加属性。
分类中可以添加实例方法,类方法,甚至可以实现协议,添加属性,不可以添加成员变量。
网友评论