首先要讲到一点
就是extension和category是不同的概念。
特别是针对属性这一点的区别上面,前者是在编译期决定的对象的内存分配,后者并不能在编译期去决定一个对象的内存分配。
前者会生成一个私有成员变量,并且通过setter和getter去访问和操作这个成员变量。
但是在category中,并不能去生成这个私有变量,因为对象的结构在编译期已经被决定了。
所以想在category中实现属性的概念,那么就要用到关联类型了。
会用到这两个函数,一个用来设置,一个用来获取
objc_setAssociatedObject(self, @"name",name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_getAssociatedObject(self, @"name");
把对应代码放到属性的getter和setter里就可以实现需要的动态增加属性功能。
-- 实现原理
全局保存一个AssociationManager
AssociationManger存有一个AssociationHashMap(哈希表,值类型为ObjectAssociationMap)
根据传入的object做DISGUISE(系列的变形操作),并以此作为AssociationHashMap的键。
ObjcAssociation是一个类型(包含了policy和value)
如果是设值,就可以 创建一个ObjcAssociation(由传入的value和policy),并且根据传入的key,以键值的形式存储到object对应的ObjectAssociationMap里。
如果是取值,就是通过object取到对应的ObjectAssociationMap,并且通过key,取到对应的ObjcAssociation, 再通过对应的value。
网友评论