iOS block

block本质上也是一个oc对象,它内部也有个isa指针
block是封装了函数调用以及函数调用环境的oc对象

B8C55828-A391-4CB5-B16B-C089478505A8.png

isa代表了block的类型
funcptr指向将来函数调用的地址
des代表了计算blcok的大小

3D78659A-B793-4D23-ACB1-8DE20339C18A.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属于静态变量只会创建一次离开作用域也不会销毁

8AA49899-5AE7-4B51-8D53-59D2EA1D7BB0.png

之所以局部变量需要捕获是因为只能在当前函数调用而跨函数调用block就不可以调用了所以才需要将值存到block里面
而全局变量不需要捕获是因为可以全局调用

你可能感兴趣的:(iOS block)