关联对象及其实际应用

简介

关联对象即给某个对象关联许多其他的对象,这些对象通过”键”来区分。关联这些对象时,可以指明存储策略,可用的存储策略值如下:

  • OBJC_ASSOCIATION_ASSIGN:等效于@property (assign) 或 @property (unsafe_unretained)

  • OBJC_ASSOCIATION_RETAIN_NONATOMIC:等效于@property (nonatomic, strong)

  • OBJC_ASSOCIATION_COPY_NONATOMIC:等效于@property (nonatomic, copy)

  • OBJC_ASSOCIATION_RETAIN:等效于@property (atomic, strong)

  • OBJC_ASSOCIATION_COPY:等效于@property (atomic, copy)




相关的API

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

    • 作用:以给定的键和策略为某对象设置关联对象值
  • objc_getAssociatedObject(id object, void *key)

    • 作用:根据给定的键从某对象中获取对应的对象值
  • objc_removeAssociatedObjects(id object)

    • 作用:移除指定对象的全部关联对象




实际应用

应用一:通过关联对象给Category添加属性(以给ViewController+Alias添加一个aliasName属性为例)

  1. // UIViewController+Alias.h
  2. @interface UIViewController (Alias)
  3. @property (nonatomic, strong) NSString *aliasName;
  4. @end
  5. // UIViewController+Alias.m
  6. #import <objc/runtime.h>
  7. #import "UIViewController+Alias.h"
  8. @implementation UIViewController (Alias)
  9. - (void)setAliasName:(NSString *)alias {
  10. objc_setAssociatedObject(self, @selector(aliasName), alias, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  11. }
  12. - (NSString *)aliasName {
  13. return objc_getAssociatedObject(self, @selector(aliasName));
  14. }




参考资料