Block的原理

block的原理是怎样的?本质是什么?

  • 本质就是一个封装了函数调用impl.FuncPtr以及函数调用环境函数需要的参数的OC对象impl.isa
Block的本质.jpg
Block的结构.jpg
Block的循环引用.jpg
__block的__forwarding指针.jpg

__block的作用是什么?有什么使用注意点?

  • __block修饰的变量会被包装成另一种对象,可以用于解决block内部无法修改auto变量值的问题,先通过这个对象再通过__forwarding指针就可以访问到那个变量进行修改

  • 注意内存管理的问题,如果修饰的是对象,block拷贝到堆上时,在ARC环境下会对对象做retain操作,而MRC环境下则不会。

__block的内存管理(释放).jpg
__block的内存管理(引用).jpg
Block捕获的对象类型的auto变量.jpg
MRC解决循环引用问题.jpg
Block的变量捕获.jpg

block的属性修饰词为什么是copy?使用block有哪些使用注意?

  • block一旦没有进行copy操作就不会在堆上,拷贝在堆上是为了控制block的生命周期,进行内存管理
  • 使用注意:循环引用
ARC解决循环引用问题.jpg

block在修改NSMutableArray,需不需要添加__block?

  • 不需要,NSMutableArray有相应的api来修改数组内容,这是直接使用这个变量,而不是修改这个变量,所以不需要__block修饰,
  • __block能不加就尽量不加,加了数据结构就变得复杂,会生成一个额外的结构体
Block和__block的内存管理.jpg
__block修饰符.jpg
对象类型的__blcok变量的内存管理.jpg
对象类型的__blcok变量和auto变量.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容