objc_setAssociatedObject 关联对象

使用场景:在分类中,不允许创建实例变量,这里就解决了此问题

参考: https://www.cnblogs.com/someonelikeyou/p/7162613.html

 

属性的实质:就是实例变量+set+get 方法

协议和分类中只会生成setter和getter的声明,如果要实现,还得借助runtime:

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

id objc_getAssociatedObject(id object, const void *key); 

void objc_removeAssociatedObjects(id object);
 
key:要保证全局唯一,key与关联的对象是一一对应关系。必须全局唯一。通常用@selector(methodName)作为key。
另外也可以用_cmd表示取当前方法
另外用自定义key也行 static const char Key; 
value:要关联的对象。
policy:关联策略。有五种关联策略。
OBJC_ASSOCIATION_ASSIGN 等价于 @property(assign)。
OBJC_ASSOCIATION_RETAIN_NONATOMIC等价于 @property(strong, nonatomic)。
OBJC_ASSOCIATION_COPY_NONATOMIC等价于@property(copy, nonatomic)。
OBJC_ASSOCIATION_RETAIN等价于@property(strong,atomic)。
OBJC_ASSOCIATION_COPY等价于@property(copy, atomic)。
 不需要做任何释放对象的事 

 

posted @ 2018-02-27 17:22  liuw_flexi  阅读(229)  评论(0编辑  收藏  举报