Associated Object关联对象也是runtime应用里面的一种.
由于category_t的结构体里面没有objc_ivar_list,所以无法添加成员变量,可以通过@property来添加属性,但是
分类中@property生成属性,并不能自动生成setter/getter方法,需要我们@dynamic方法,或者手动生成setter/getter方法.
简单总结关联对象实现原理:
关联对象其实就是ObjcAssociation对象
关联对象由AssociationManager管理并在AssociationsHashMap存储,通过spinlock_t来保证线程安全
AssociationsHashMap里面存储了ObjcAssociationMap的指针地址
ObjcAssociationMap存储了const void * _Nonnull key值, value就是ObjcAssociation对象
ObjcAssociation对象存了id _Nullable value/(associatedObject), objc_AssociationPolicy policy/(OBJC_ASSOCIATION_RETAIN_NONATOMIC)