iOS-category为什么不支持属性

"类中使用@property声明属性,系统会自动生成带“_”的成员变量,以及该变量的getter和setter方法"

category使用@property声明属性只是将该属性放进了属性列表中,但是并没有生成相应的成员变量,也没有实现getter和setter方法。

category是运行时绑定方法的功能,而类属性需要在编译期确定。所以category不支持属性。

可以通过运行时方法添加。category不是一个类,没有自己的ISA属性

“category 它是在运行期决议的。 因为在运行期即编译完成后,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的” 引用

那为什么可以使用Runtime可以添加属性?

代码中涉及到的一些数据结构。

  1. AssociationsManager 是顶级的对象,维护了一个从 spinlock_t 锁到 AssociationsHashMap 哈希表的单例键值对映射;
  2. AssociationsHashMap 是一个无序的哈希表,维护了从对象地址到 ObjectAssociationMap 的映射;
  3. ObjectAssociationMap 是一个 C 中的 map ,维护了从 key 到 ObjcAssociation 的映射,即关联记录;
  4. ObjcAssociation 是一个 C 的类,表示一个具体的关联结构,主要包括两个实例变量,_policy 表示关联策略,_value 表示关联对象。出处

通过

static char* sexKey = "sexKey";
- (void)setSex:(NSString *)sex{
    objc_setAssociatedObject(self, sexKey, sex, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString*)sex{
    return objc_getAssociatedObject(self, sexKey);
}

这个方法增加的对象,在类里的内存地址也是连续的。


猜你喜欢

转载自blog.csdn.net/jade07/article/details/80234495