Block

2023-07-27  本文已影响0人  万万万万万万一

Block的本质

Block本质是一个oc对象,它内部有一个isa指针

Block是封装了函数调用以及函数调用环境的oc对象

Block 的变量捕获(capture)

111.png

Block类型

222222.png

MRC情况下

3333.png

Block类型copy 结果 MRC情况下 (ARC 自动从栈区 拷贝到堆区)

4444.png

ARC情况下Copy

编译器会自动把栈区 block 拷贝到堆区

block作为函数的返回值时

block赋值给_ _strong指针时(强指针时)

block最为cocoaAPI中方法名usingBlock的方法参数时 比如数组遍历[array enumeObjc usingBlock.....]

block最为GCD API方法参数时

当对象类型的auto变量时

当block内部访问了对象类型的auto变量时

如果block在栈区,将不会对auto变量产生强引用(mrc 或arc情况)

如果block在堆区

5555.png

__block修饰符

666.png

__block内存管理问题

7777.png

对象类型的auto变量 __block变量

888.png

block 循环引用

ARC环境下

111.png 2222.png

ARC环境下 (不支持弱指针 __weak)

3333.png
上一篇 下一篇

猜你喜欢

热点阅读