全面解析Objective-C中的block代码块的使用

2020-01-14 17:18:34于海丽

    };
    logBlock( myBlock );
    [ pool release ];
    return EXIT_SUCCESS;
}
上面的代码在main函数中声明了一个整型,并赋值42,另外还声明了一个block,该block会将42返回。然后将block传递给logBlock函数,该函数会显示出返回的值42。即使是在函数logBlock中执行block,而block又声明在main函数中,但是block仍然可以访问到x变量,并将这个值返回。

 

注意:block同样可以访问全局变量,即使是static。

2.4 block中变量的复制与修改

对于block外的变量引用,block默认是将其复制到其数据结构中来实现访问的,如下图:

全面解析Objective-C中的block代码块的使用

通过block进行闭包的变量是const的。也就是说不能在block中直接修改这些变量。来看看当block试着增加x的值时,会发生什么:

复制代码
myBlock = ^( void )
{
    x++;
    return x;
};
编译器会报错,表明在block中变量x是只读的。

 

有时候确实需要在block中处理变量,怎么办?别着急,我们可以用__block关键字来声明变量,这样就可以在block中修改变量了。

基于之前的代码,给x变量添加__block关键字,如下:

复制代码
__block int x;
对于用__block修饰的外部变量引用,block是复制其引用地址来实现访问的,如下图: