1. block的原理本质
之前简单说一下
block的定义和基本的使用
可以点击这边查看
- block的
本质是
一个OC对象
,其内部也是有isa
指针指向 block这个对象
其实是封装了函数调用和函数调用的环境
我们定义一个简单的
block
,通过终端把mian.m
文件转化为c++
文件来查看里面的代码
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
上面的 命令可以 转化为c++
代码
2.block对变量的捕获
2.1.局部变量
- 局部变量:离开作用域自动销毁, 值传递
- static 修饰局部变量 指针传递
2.2.全局变量
3.block的类型
3.1 继承类型
继承顺序
__NSMallocBlock__
->__NSMallocBlock
->NSBlock
->NSObject
int a = 10;
void(^block)(void) = ^{
NSLog(@"测试--%d",a);
};
Class blockCls = object_getClass(block);
while (blockCls) {
NSLog(@"类型%@",blockCls);
blockCls = class_getSuperclass(blockCls);
}
3.2 block的分类
__NSGlobalBlock__
没有访问auto
变量的block都是这个类型__NSStaticBlock__
访问auto
变量的block都是这个类型 【前提是在MRC
的环境下】,【如果在ARC
情况下是__NSMallocBlock__
,因为在ARC
系统会自动调用一次copy
讲在栈区
变换到堆区
】__NSMallocBlock__
当__NSStaticBlock__
调用copy
代码段
:直接存放代码
数据
: 全局变量存放到 数据段
堆
: 一般存放动态分配内存 alloc开辟的
,需要开发者申请内存和管理内存
栈
:一般存放局部变量,系统自动分配内存,自动销毁
在
ARC
情况下,系统会自动将栈
的block
,copy
一次放到堆
上
比如:GCD中block
的参数
4.修改在block内部修改变量
- 局部变量,在block
内部
是可以修改的
用
static
修饰 可以更改
全局变量可以修改
用__block
修饰可以更改
__block int a = 10;
void(^myblock)(void) = ^{
a = 5;
NSLog(@"%d",a);
};
myblock();