五、block

注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正
1.block有传值和传地址,局部变量是传值,如果加了__block修饰的局部变量变为传地址

  • block没有访问外部变量,即为全局区
    1.MRC下访问了外部变量为栈区,使用copy进入堆区
    2.ARC下访问了外部变量为堆区
  • __weak解决block的循环引用
  • 如果block内部调用了延时函数,需要在block内部强引用下

1.什么是block?

block是将函数及其执行上下文封装起来的对象

2.截获变量

局部变量

  • 基本数据类型。值传递
  • 对象类型。对于对象类型的局部变量连同所有权修饰符一起截获。值传递

静态局部变量。指针截获
全局变量。不截获
静态全局变量。不截获

3.__block修饰符
  • 一般情况下,对截获变量进行赋值操作需要添加__block修饰符。
  • 静态局部变量、全局变量、静态全局变量不需要__block修饰符。
  • __block修饰的变量变成了对象。栈上的__forwarding指向自己。栈block经copy到堆block,栈上的__forwarding 指向堆block的__block变量;堆上的__forwarding指向的是自己__block变量
  • __forwarding的总结
    不论在任何内存位置,都可以通过__forwarding顺利的访问同一个__block变量

4.Block的内存管理

  • 全局Block
    copy,什么也不做

  • 堆区block
    copy,增加引用计数

  • 栈区Block
    copy,堆区copy

  • 栈上Block的销毁

5.block的引用循环

__weak进行解决。截获局部变量对象,会连同修饰符一起截获。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容