0
点赞
收藏
分享

微信扫一扫

iOS block

梦想家们 2021-09-19 阅读 69
日记本

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

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

接下来看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属于静态变量只会创建一次离开作用域也不会销毁


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

举报

相关推荐

0 条评论