iOS系统

iOS中Category如何实现属性,关联对象是如何实现的

2019-03-15  本文已影响0人  长鲜

首先要讲到一点
就是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。

上一篇下一篇

猜你喜欢

热点阅读