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里面
而全局变量不需要捕获是因为可以全局调用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容