iOS - 关联对象的实现

news/2025/1/19 13:30:02/

根据源码总结一下关联对象(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 标记优化查找

http://www.ppmy.cn/news/1564421.html

相关文章

掌握 React 高阶组件与高阶函数:构建可复用组件的新境界

一、引言 在 React 开发中&#xff0c;代码复用性和逻辑分离是提高开发效率和维护性的重要手段。高阶组件&#xff08;Higher-Order Component, HOC&#xff09;和高阶函数&#xff08;Higher-Order Function, HOF&#xff09;是实现这一目标的两种强大工具。本文将详细介绍这…

隧道IP广播与紧急电话系统:提升隧道安全的关键技术

隧道IP广播与紧急电话系统&#xff1a;提升隧道安全的关键技术 随着现代城市交通的迅猛发展&#xff0c;隧道作为重要的交通基础设施&#xff0c;其安全性与应急处理能力显得尤为重要。隧道IP广播与紧急电话系统作为保障隧道安全的关键技术&#xff0c;正发挥着越来越重要的作…

HarmonyOS使用Grid网格实现计算器功能实现

使用Grid网格处理&#xff0c;实现了计算器的加减乘除功能 Entry Component struct GridPage {State str: string ""; //暂存区State num: string "0"; //输入区State flagNum: boolean false; //标识build() {Column() {Grid() {GridItem() {Text(this…

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…

在 Azure 100 学生订阅中新建 Ubuntu VPS 并部署 Mastodon 服务器

今天想和大家分享一下如何在 Azure 的 100 学生订阅中&#xff0c;创建一台 Ubuntu VPS&#xff0c;并通过 Docker 部署 Mastodon 服务器。Mastodon 是一个开源的社交网络平台&#xff0c;允许用户创建自己的实例&#xff0c;类似于 Twitter&#xff0c;但更加去中心化。Docker…

计算机网络 (45)动态主机配置协议DHCP

前言 计算机网络中的动态主机配置协议&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;主要用于自动分配IP地址和其他网络配置参数给连接到网络的设备。 一、基本概念 定义&#xff1a;DHCP是一种网络协议&#xf…

FPGA车牌识别

基于FPGA的车牌识别主要包含以下几个步骤&#xff1a;图像采集、颜色空间转换、边缘检测、形态学处理&#xff08;腐蚀和膨胀&#xff09;、特征值提取、模板匹配、结果显示。先用matlab对原理进行仿真&#xff0c;后用vivado和modelsim进行设计和仿真。 一、1.图像采集采用ov…

css 实现自定义虚线

需求&#xff1a; ui 画的图是虚线&#xff0c;但是虚线很宽正常的border 参数无法做到 进程&#xff1a; 尝试使用 border&#xff1a;1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单&#xff0c;让ui 画一个图然…