注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正
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进行解决。截获局部变量对象,会连同修饰符一起截获。
网友评论