1. 变量捕获
1.自动变量
![](https://i-blog.csdnimg.cn/blog_migrate/c39d1ea2ea4ab7768ef9fcfe0fc762eb.png)
- 值传递, 把值复制过来
外部变量改变了,block里面的变量值不会改变,说明是两个变量,并不是同一个
int autovari = 10;
void (^auto_block)(void) = ^{
NSLog(@"auto_block---%d",autovari);
};
autovari = 11;
NSLog(@"autovari---%d",autovari);
auto_block();
2. static变量
![](https://i-blog.csdnimg.cn/blog_migrate/110f3d9db129d617318abadf4ad798d4.png)
- 指针传递 捕获的是静态变量的地址
外部把变量的值改变了,block里面的值也会改变
block里面的静态变量指针指向的是静态变量
static int staticvari = 20;
void (^static_block)(void) = ^{
NSLog(@"static_block---%d",staticvari);
};
staticvari = 21;
NSLog(@"staticvari---%d",staticvari);
static_block();
3. 全局变量
![](https://i-blog.csdnimg.cn/blog_migrate/a604f5534a599350da6548e755ce9332.png)
2. 总结
![](https://i-blog.csdnimg.cn/blog_migrate/931c2b301621b200ee73ca59f1e509b1.png)
- 局部变量会捕获,全局不变不会被捕获
局部变量随时可能消失,block要使用的时候就有可能找不到这个局部变量,所以要捕获到block的内部,这样使用的时候就不需要管外部的局部变量是不是还存在,只要使用内部的捕获变量就行 - 变量时对象也是一样的(对象类型的局部变量连所有权修饰符一起捕获)(__strong,__weak都会捕获)
![](https://i-blog.csdnimg.cn/blog_migrate/df3b5d2d844485e086d4c781541a4919.png)