怎么在iOS中关联对象

  介绍

怎么在iOS中关联对象?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>存值

void  objc_setAssociatedObject (id 对象,const  void  *键,id 价值,objc_AssociationPolicy 政策),{   ,_object_set_associative_reference(对象,,(void  *)键,,,,政策);   }

我们调用此方法的时候,一共传递了四个参数:

参数名称解释id对象需要关联的对象void *键对应的keyid价值对应的值objc_AssociationPolicy政策内存管理策略

内存管理策略:

typedef  OBJC_ENUM (uintptr_t, objc_AssociationPolicy), {=,OBJC_ASSOCIATION_ASSIGN  0,,,/* * & lt;, Specifies  a  weak 参考文档用,associated 对象只*/,OBJC_ASSOCIATION_RETAIN_NONATOMIC =, 1,,/* * & lt;, Specifies  a  strong 参考文档用,associated 对象。   ,,,,,*,从而association  is  not  made 自动只*/=,OBJC_ASSOCIATION_COPY_NONATOMIC  3,,/* * & lt;, Specifies  that 从而associated  object  is 复制。   ,,,,,*,从而association  is  not  made 自动只*/01401年,OBJC_ASSOCIATION_RETAIN =,,,/* * & lt;, Specifies  a  strong 参考文档用,associated 对象。   ,,,,,*,从而association  is  made 自动只*/=,OBJC_ASSOCIATION_COPY , 01403,,/* * & lt;, Specifies  that 从而associated  object  is 复制。   ,,,,,*,从而association  is  made 自动只*/};

对于四个参数理解完了之后让我们看看它真正的实现函数_object_set_associative_reference

void  _object_set_associative_reference (id 对象,void  *键,id 价值,uintptr_t 政策),{   ,//retain 从而new  value  (if 有),outside 从而锁。   ,ObjcAssociation  old_association (0, nil);   ,id  new_value =, value  ?, acquireValue(价值,,政策),:,零;   ,{   ,AssociationsManager 经理;   ,AssociationsHashMap 和协会(manager.associations ());   ,disguised_ptr_t  disguised_object =,伪装(对象);//得到对象地址   ,if  (new_value), {//才能,break  any  existing 协会。   AssociationsHashMap才能:iterator 小姐:=,associations.find (disguised_object);//首先通过对象的地址获取对象的hashmap   if 才能;(小姐:!=,associations.end()),{//判断是否已经存在,已经存在//才能,secondary  table 存在   ObjectAssociationMap 才能;* refs =,我→第二;//取值,对应的地图   ObjectAssociationMap才能:iterator  j =,参→找到(关键);//通过关键查找   if 才能;(j  !=,参→结束()),{//如果已经存在   ,,old_association =, j→第二;//取到原来老的值,以便后边对其释放   ,,j→second =, ObjcAssociation(政策,,new_value);//存储新的值   ,,},else {//不存在   ,,参(*)(例子),=,ObjcAssociation(政策,,new_value);   ,,}   ,,},else {//如果不存在,创建一个//才能,create 从而new  association  (first 时间)。   ObjectAssociationMap 才能;* refs =, new  ObjectAssociationMap;   协会(disguised_object)才能,=,参考文献;   参(*)才能(例子),=,ObjcAssociation(政策,,new_value);   对象才能→setHasAssociatedObjects ();   ,,}   ,}else {//不存在则创建一个//才能,setting 从而association 用nil  breaks 从而协会。   AssociationsHashMap才能:iterator 小姐:=,associations.find (disguised_object);   if 才能;(小姐:!=,associations.end ()), {   ObjectAssociationMap 才能;* refs =,我→第二;   ObjectAssociationMap才能:iterator  j =,参→找到(关键);   if 才能;(j  !=,参→结束()),{   ,,old_association =, j→第二;   ,,参考文献→删除(j);   ,,}   ,,}   ,}   ,}   ,//release 从而old  value  (outside  of 从而锁)。   ,if  (old_association.hasValue ()), ReleaseValue () (old_association);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在iOS中关联对象