关联对象(给分类添加成员变量)

默认情况下,因为分类底层结构的限制,不能田间成员变量到分类中。但可以通过关联对象来间接实现
关联对象提供了以下api
添加关联对象

void
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)

获得关联对象

id _Nullable
objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)

移除所有的关联对象

void
objc_removeAssociatedObjects(id _Nonnull object)

key的常见用法

static const void * MyKey = & MyKey;
objc_setAssociatedObject(obj, MyKey,
                         value,OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, MyKey)

static const char MyKey;
objc_setAssociatedObject(obj,& MyKey,
                         value,OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, &MyKey)

使用属性名作为key

objc_setAssociatedObject(obj,@"property",
                         value,OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, @"property")

使用get方法的@selecot作为key

objc_setAssociatedObject(obj,@selector(getter),
                         value,OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, @selector(getter))

Screen Shot 2020-04-15 at 10.45.26 PM.png

你可能感兴趣的:(关联对象(给分类添加成员变量))