欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > iOS - 关联对象的实现

iOS - 关联对象的实现

2025/2/21 3:06:01 来源:https://blog.csdn.net/Batac_Lee/article/details/145154106  浏览:    关键词:iOS - 关联对象的实现

根据源码总结一下关联对象(Associated Objects)的实现:

1. 关联对象的基本结构

// 对象的 isa 结构中包含关联对象标记
union isa_t {struct {uintptr_t nonpointer     : 1;  // 是否使用优化的 isauintptr_t has_assoc      : 1;  // 是否有关联对象// ...其他位域};
};// 关联对象表
struct AssociationsManager {static AssociationsHashMap *_map;  // 全局的关联对象哈希表
};

2. 关联对象的存储

// 关联对象的存储结构
class ObjcAssociation {uintptr_t _policy;   // 关联策略id _value;           // 关联的值// 关联策略OBJC_ASSOCIATION_ASSIGNOBJC_ASSOCIATION_RETAIN_NONATOMICOBJC_ASSOCIATION_COPY_NONATOMICOBJC_ASSOCIATION_RETAINOBJC_ASSOCIATION_COPY
};

3. 关联对象的操作

// 设置关联对象
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) {// 1. 标记对象有关联对象object->isa.has_assoc = true;// 2. 存储关联对象AssociationsManager manager;manager.set(object, key, value, policy);
}// 获取关联对象
id objc_getAssociatedObject(id object, const void *key) {// 从关联对象表中获取值AssociationsManager manager;return manager.get(object, key);
}

4. 内存管理

// 对象释放时清理关联对象
void _object_remove_assocations(id object) {// 1. 获取对象的所有关联对象AssociationsManager manager;AssociationsHashMap &associations = manager.associations();// 2. 根据策略释放关联对象if ((entry = associations.find(object)) != associations.end()) {// 清理关联对象entry->second.clear();// 从哈希表中移除associations.erase(entry);}
}

5. 线程安全

class AssociationsManager {static OSSpinLock _lock;  // 自旋锁保护void set(id object, const void *key, id value, objc_AssociationPolicy policy) {OSSpinLockLock(&_lock);// 设置关联对象OSSpinLockUnlock(&_lock);}
};

6. 性能优化

// 1. 使用自旋锁而不是互斥锁
static OSSpinLock AssociationsManagerLock;// 2. 哈希表实现
typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap;
typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMap;

7. 关键特性

1. 动态性:

// 运行时动态添加属性
objc_setAssociatedObject(self, &key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

   2. 内存管理:

// 不同的关联策略
OBJC_ASSOCIATION_ASSIGN           // 弱引用
OBJC_ASSOCIATION_RETAIN_NONATOMIC // 强引用,非原子
OBJC_ASSOCIATION_COPY_NONATOMIC   // 复制,非原子

3. 线程安全:

// 通过自旋锁保证线程安全
OSSpinLockLock(&_lock);
// 操作关联对象
OSSpinLockUnlock(&_lock);

关联对象的实现特点:

  1. 使用全局哈希表存储
  2. 支持不同的内存管理策略
  3. 保证线程安全
  4. 对象释放时自动清理
  5. 通过 isa 标记优化查找

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词