block本质上也是一个oc对象,它内部也有个isa指针
block是封装了函数调用以及函数调用环境的oc对象
![](https://img.haomeiwen.com/i1192250/5542e1e5e55323f3.png)
isa代表了block的类型
funcptr指向将来函数调用的地址
des代表了计算blcok的大小
![](https://img.haomeiwen.com/i1192250/955907ba6c9b2852.png)
接下来看block的捕获
int width = 10;
static int height = 10;
void (^block)(void) = ^{
NSLog(@"width %d height%d",width,height);
打印结果 width 10 height20
};
width = 20;
height = 20;
block();
之所以 width 没有变成20 是因为 变量类型是 auto 属于值传递 在修改为20之前就已经把10传入到block里面去了
属于自动变量离开作用域就会销毁
而height 变成20 则是它属于指针传递,我们都知道只要拿到地址就可以改值和取值.而static属于静态变量只会创建一次离开作用域也不会销毁
![](https://img.haomeiwen.com/i1192250/684be4fe35bc0de9.png)
之所以局部变量需要捕获是因为只能在当前函数调用而跨函数调用block就不可以调用了所以才需要将值存到block里面
而全局变量不需要捕获是因为可以全局调用
网友评论