【连载】探究Block底层原理(一)
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
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有兴趣,请关注程序员华仔
想要了解更多内容?
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)