扫码阅读
手机扫码阅读

【连载】探究Block底层原理(一)

53 2024-07-09
Block知识总结摘要

Block知识总结摘要

本文详细探讨了Block在Objective-C中的三种分类、它们的底层原理以及循环引用的问题。

Block分类

Block在Objective-C中有三种类型:__NSGlobalBlock__NSStackBlock__NSMallocBlock,均继承自NSBlock类型。这些类型可以通过isa指针进行识别。

__NSGlobalBlock

全局Block在编译时分配空间,位于ELF文件的.data区域或Mach-O文件中,不涉及内存释放问题。

__NSStackBlock

栈Block在栈内分配空间,随栈的作用域结束而释放内存。

__NSMallocBlock

堆Block在堆内分配空间,通过引用计数管理内存释放,copy操作会增加计数,而release会减少计数。

区分Block类型

判断Block类型的原则包括:

  • GlobalBlock不使用外部变量或静态/全局变量。
  • MallocBlock使用了外部变量或OC属性,并且赋值给强引用或copy修饰的变量。
  • StackBlock使用了外部变量或OC属性,但没有赋值给强引用或copy修饰的变量。

通过一系列实例,文章演示了如何鉴别不同类型的Block,以及属性中的Block为何采用copy修饰符:为了避免栈上的Block在函数作用域结束后被释放,导致调用时崩溃,Block需要被拷贝到堆上。

实例分析

文中提供了几个实例,说明了不同Block类型的特点、内存地址情况以及它们在属性和变量中的使用方式。

例如,一个StackBlock赋值给strong修饰的变量时,原StackBlock并未被拷贝到堆上;而当StackBlock通过copy操作赋给某个属性时,它变成了MallocBlock类型。

通过这些实例,读者可以更好地理解Block的分类和使用场景,为下一章节的底层原理讨论做好铺垫。

END有兴趣,请关注程序员华仔

想要了解更多,点击 查看原文