什么是Block
截获变量
__block修饰符
内存管理
循环引用
什么是Block?
将函数及其执行上下文封装起来的对象。
- 函数
- 上下文
- 对象
源码实现,看结构体
*block的本质和函数调用
截获变量
- 局部变量
- 基本数据类型
截回其置 - 对象类型
连同所有权修饰符一起截获
- 静态局部变量
以指针形式截回 - 全局变量
不截获 - 静态全局变量
不截获
__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截获变量的特性?
遇到那些循环应用,怎么解决的?
网友评论