五、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进行解决。截获局部变量对象,会连同修饰符一起截获。

你可能感兴趣的:(五、block)