iOS - block

ops/2025/1/16 5:56:12/

1. Block 的内存管理

// Block 的基本结构
struct Block_layout {void *isa;                // Block 的类型信息volatile int32_t flags;   // 标志位,包含引用计数等信息int32_t reserved;         // 保留字段void (*invoke)(void *, ...); // 函数指针,指向 Block 的实现struct Block_descriptor *descriptor; // Block 的描述信息
};// Block 的描述信息
struct Block_descriptor {unsigned long int reserved;     // 保留字段unsigned long int size;         // Block 的大小// 可选字段void (*copy)(void *dst, void *src);     // 复制辅助函数void (*dispose)(void *);               // 析构辅助函数
};

2. 弱引用处理

// 处理 Block 中的弱引用
void Block_object_assign(void *destAddr, const void *object, const int flags) {// 根据 flags 判断是强引用还是弱引用if (flags & BLOCK_FIELD_IS_WEAK) {// 处理弱引用weak_register_no_lock(&weak_table, object, destAddr);}
}// 清理 Block 中的引用
void Block_object_dispose(const void *object, const int flags) {if (flags & BLOCK_FIELD_IS_WEAK) {// 清理弱引用weak_unregister_no_lock(&weak_table, object, (void *)object);}
}

3. 引用计数管理

// Block 的引用计数管理
bool Block_tryRetain(const void *block) {struct Block_layout *layout = (struct Block_layout *)block;// 检查 Block 类型if (!layout->flags & BLOCK_NEEDS_FREE) {return true; // 全局或栈上的 Block}// 增加引用计数return OSAtomicIncrement32Barrier(&layout->flags) > 0;
}void Block_release(const void *block) {struct Block_layout *layout = (struct Block_layout *)block;// 减少引用计数if (OSAtomicDecrement32Barrier(&layout->flags) == 0) {(*layout->descriptor->dispose)(block);}
}

4. 内存管理优化

// Block 的内存优化
struct Block_byref {void *isa;                // 类型信息struct Block_byref *forwarding; // 指向自身或堆上的副本volatile int32_t flags;   // 标志位uint32_t size;            // Block 大小
};// 优化 Block 的复制
static void Block_copy_helper(Block_byref *dst, Block_byref *src) {// 1. 复制基本信息dst->forwarding = dst;  // 更新 forwarding 指针dst->size = src->size;// 2. 处理引用计数if (src->flags & BLOCK_HAS_COPY_DISPOSE) {// 调用 copy helper 函数(*src->byref_keep)(dst, src);}
}

5. 线程安全处理

// Block 的线程安全处理
static void Block_release_internal(void *block) {struct Block_layout *layout = (struct Block_layout *)block;// 原子操作处理引用计数if ((OSAtomicDecrement32Barrier(&layout->flags) & BLOCK_REFCOUNT_MASK) == 0) {if (layout->flags & BLOCK_NEEDS_FREE) {_Block_call_dispose_helper(block);_Block_destructInstance(block);}}
}

6. 注意事项

/*
Block 使用注意事项:1. 内存管理:- 注意循环引用- 正确使用 __weak 和 __strong- 注意 Block 的拷贝和释放2. 线程安全:- Block 的执行线程- 数据竞争问题- 同步访问共享数据3. 性能考虑:- Block 的大小- 拷贝开销- 内存使用
*/

总结要点:

1. 内存管理:

  • 引用计数机制
  • 弱引用处理
  • 拷贝和释放

2. 优化机制:

  • 内联优化
  • 内存布局优化
  • 引用计数优化

3. 线程安全:

  • 原子操作
  • 同步机制
  • 内存屏障

4. 注意事项:

  • 循环引用
  • 内存泄漏
  • 性能影响

http://www.ppmy.cn/ops/150475.html

相关文章

15.7 hana 清理online log

1.停止数据库:HDB stop 2.将整个日志目录move到其他文件夹 h4dscd:h4dadm> cd logs_temporary/ h4dscd:h4dadm> pwd /usr/sap/H4D/HDB00/backup/logs_temporary h4dscd:h4dadm> cd /hana/log/H4D/mnt00001 h4dscd:h4dadm> mv hdb00002.00003 /usr/sap/H4D/

【深度学习】自编码器(Autoencoder, AE)

自编码器(Autoencoder, AE)是一种无监督学习模型,主要用于特征提取、数据降维、去噪和生成模型等任务。它的核心思想是通过将输入压缩到一个低维的潜在空间表示(编码过程),然后再从这个潜在表示重构输入&am…

Spring官网构建Springboot工程

注意:基于Idea的 Spring Initializr 快速构建 SpringBoot 工程时需要联网。 1.进入SpringBoot官网 Spring | Home 点击QUICKSTART 点击start.spring.io进入spring initializr 2.选择依赖 3.生成工程 下载好后解压用IDEAD导入即可。

redhat安装docker 24.0.7

1、下载docker镜像包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz 2、解压 tar -xvf docker-24.0.7.tgz 3、解压的docker文件夹全部移动至/usr/bin目录 cd docker cp -p docker/* /usr/bin 4、注册服务 vi /usr/lib/systemd/syste…

CNN中模型的参数量与FLOPs计算

CNN中模型的参数量与FLOPs计算 一个卷积神经网络的基本构成一般有卷积层、归一化层、激活层和线性层。这里我们就通过逐步计算这些层来计算一个CNN模型所需要的参数量和FLOPs吧. 另外,FLOPs的全程为floating point operations的缩写(小写s表复数&#x…

2_CSS3 背景 --[CSS3 进阶之路]

CSS3 中的背景属性提供了许多强大的功能来增强网页设计,包括但不限于多背景图像、渐变、背景大小控制等。以下是一些关键的 CSS3 背景属性及其用法示例。 1. 多重背景图像 CSS3 允许你为一个元素设置多个背景图像。这些图像按照它们在 background-image 属性中定义…

软件设计:工厂设计模式

工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。 ​ 还有一个很重要的原因…

python识别图片中指定颜色的图案并保存为图片

示例代码: def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…