介绍
怎么在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中关联对象