block 原理总结

block 对变量的引用:

  • 局部变量,传递的是值,因为局部变量可能在 block 执行之前就被销毁,所以传递的是值
  • 局部静态变量,传递的是指针
  • 全局静态变量,全局变量,不需要传递,因为在全局区,所以在哪里都可以访问的到
  • __block 变量,传递的是结构体指针,__block可以修饰局部变量
  • 属性和实例变量,传递的是 self

存储位置

在 ARC 下只访问局部变量的 block 会放在栈上,但是 ARC会在以下情况下自动 copy 到堆上
1、block 作为函数返回值时
2、block 用 strong 修饰时,ARC 对象默认修饰符为 strong
3、block作为Cocoa API中方法名含有usingBlock的方法参数时
4、作为GCD API的方法参数时

要点

  • 没有访问局部变量的 block 会放在全局区

  • 不能把堆上的 block 拷贝到栈上,可以把堆上的 block 移至 全局区

  • 引用全局变量、全局静态变量、局部静态变量:Block 在全局区,属于 GlobalBlock

  • 引用普通外部变量,用 copy,strong 修饰的 Block 就存放在堆区,属于 MallocBlock;用 weak 修饰的Block 存放在栈区,属于 StackBlock

block 块引用对象时,copy函数会将person地址传入_Block_object_assign函数,_Block_object_assign中对Person对象进行强引用或者弱引用
无论如何block内部中对__block修饰变量生成的结构体都是强引用,结构体内部对外部变量的引用取决于传入block内部的变量是强引用还是弱引用
http://www.cocoachina.com/ios/20180628/23965.html
http://www.cocoachina.com/ios/20180628/23968.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容