博客
关于我
iOS高级编程Blocks笔记
阅读量:759 次
发布时间:2019-03-23

本文共 1776 字,大约阅读时间需要 5 分钟。

Objective-C中的Blocks技术

刚接面谈Blocks

Blocks(块)是一种在Objective-C中定义的匿名函数,能够直接在内存中保持局部变量的值,而无需依赖全局变量。这种特性使得Blocks在多线程或递归编程中表现出色。

全局变量的局限性

全局变量在多次函数调用中难以维持一致的局部值,尤其是在递归函数中,其值会因调用方式不同而不断变化。传入的参数在递归中可能面临相同的全局变量问题,不利于保持一致性和稳定性。

为什么不使用局部变量 ?

在需要传递多个变量或调用多次回调时,使用局部变量可能带来不便。我们需要一种方法来保持对变量值的持续访问,而Blocks提供了一个很好的解决方案。

局部变量的截获机制

Blocks能够自动截获局部变量,并将其持有。同时,通过使用特殊关键字(如 __block),开发者可以选择需要持有的变量类型。例如,可以直接访问 i 在循环中的当前值,而不需要通过指针访问。

如何实现Blocks

Blocks的内部结构
  • 结构体实现:Blocks通过一系列结构体实现其功能,包括 __block_imp__main_block_impl_0 等,来保持变量值并执行回调函数。

  • 函数实现:Blocks函数由 __main_block_func_0 类型的函数实现,它接收一个函数指针作为参数,执行该函数并访问截获的变量值。

  • 将Blocks转换为C++代码

    在C++中,Blocks需要依赖于特定的结构体和函数。通常,通过使用 __main_block_impl_0 结构体来实现Blocks功能,并正确传递相关结构体描述。

    复制到堆上的Blocks

    当在ARC环境下使用Blocks时,可能需要显式地进行堆复制操作(如 objc_retainBlockobjc_autoreleaseReturnValue),确保Blocks在释放时正确处理内存。

    Blocks的存储域管理

    Blocks可以在不同的存储域中运行,包括栈、数据区域和堆。不同的存储域对Blocks的内存管理方式有所不同,但ARC可以自动处理这些情况,确保内存的正确释放。

    ARC与Blocks的配合

    ARC(案例分析)在Block管理中起到了关键作用。通过隐式地复制Block到堆,并安排自动释放池,将Block持有的对象资源正确释放,避免内存泄漏。

    举例说明

    typedef int (^blk_t)(int); // 定义了一个返回int类型的块blk_t func(int rate) { // 定义了一个函数,返回一个块    blk_t tmp = ^{ // 匿名函数        return rate * count; // 返回计算结果    }();    // 需要手动处理Block的内存管理    return tmp;}

    在ARC中,不需要显式地处理Block的内存管理。默认情况下,Blocks会被自动复制到堆,并在适当的时候被释放。

    截获对象与循环引用

    当截获Objective-C对象时,Blocks会持有这些对象的引用,避免循环引用产生内存泄漏。可以通过 __weak 关键字将持有的对象标记为弱引用,从而避免循环引用问题。

    实际应用示例

    @interface Person : NSObject {    blk_t blk_;    id obj_; // 截获的对象变量}@implementation Person- (instancetype)init {    if (self = [super init]) {        blk_ = ^{ // 单一语句块            NSLog(@"自refence对象");        };        return self;    }    return self;}

    init 方法中,创建一个Blocks,用于后续处理对象。这里,__block 确保了 obj_ 会被截获,并且可以在Block中被访问。

    结论

    Blocks在Objective-C中提供了灵活的内存管理和变量截获机制,简化了回调和递归场景下的开发流程。通过正确使用 __block 和 ARC,可以有效地应对多个应用场景,减少内存泄漏风险。

    转载地址:http://lavzk.baihongyu.com/

    你可能感兴趣的文章
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
    查看>>
    OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>
    OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
    查看>>
    OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
    查看>>
    OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
    查看>>
    OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
    查看>>
    OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性
    查看>>
    OpenCV与AI深度学习 | YOLOv8自定义数据集训练实现火焰和烟雾检测(代码+数据集!)
    查看>>
    OpenCV与AI深度学习 | YOLOv8重磅升级,新增旋转目标检测,又该学习了!
    查看>>