iOS Block

什么是Block

截获变量

__block修饰符

内存管理

循环引用

什么是Block?

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

  1. 函数
  2. 上下文
  3. 对象

源码实现,看结构体

*block的本质和函数调用

截获变量

  1. 局部变量
  • 基本数据类型
    截回其置
  • 对象类型
    连同所有权修饰符一起截获
  1. 静态局部变量
    以指针形式截回
  2. 全局变量
    不截获
  3. 静态全局变量
    不截获

__block修饰符

一般情况下,对被截获的变量赋值操作时候使用__block修饰(赋值: 注意数组)
否则的话就会编译报错

  • 对变量进行赋值时候的特点
    需要__block修饰符 ===> 局部变量(基本数据类型和对象类型)
    不需要__block修饰符 ===> 静态局部变量、全局变量、静态全局变量

  • __block修饰符的变量变成了对象

  • __forwarding指针是用来干什么的?

Block的内存管理

imp.isa = &_NSConcertStackBlock

copy操作

  • 栈上 堆上

  • 堆上 增加其引用计数

  • 数据区 什么也不做

  • 栈上Block销毁
    变量和block都会被销毁

  • 栈上Block的Copy
    堆上有对应的的block和__block变量都会销毁

  • 栈上Block的Copy又发生了什么
    栈上Block变量的__forwaording指针指向的自己,copy之后,栈上的__foewarding指针指向堆上的__block变量
  • __forwaordig总结
  • __forwaordig存在意义
    都可以顺利的额访问同一个__block变量

block的循环应用

__weak避免产生循环应用

  • 为什么用__weak可以呢?应为截获成员变量是对象时候,是对其修饰符所有权一起引用的

  • Block总结
    什么是block?
    为什么block会产生循环引用?
    (截获后会有强引用,__block下要看是ARC还是MRC)
    怎么理解block截获变量的特性?

遇到那些循环应用,怎么解决的?

你可能感兴趣的:(iOS Block)