block特性:截取自动变量值

2016-11-16  本文已影响40人  有一种再见叫青春

blcok是带有自动变量值的匿名函数."带有自动变量值"在block中表现为"截取自动变量值".实例如下
<pre>
int main ()
{
int dmy = 256;
int val = 10;
const char *fmt = "val = %d\n";
void (^blk)(void) = ^ {printf(fmt, val);};
var = 2;
fmt = "These values were changed. val = %d\n";
blk();

return 0;
}
</pre>
  Blcok语法的表达式使用的是它之前声明的自动变量fmt和val.Block中.Block表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值.因为Block表达式保存了自动变量的值,所以执行Blcok语法后,即使改写Blocck中使用的自动变量的值也不会影响Block执行时自动变量的值 所以执行结果 Val= 10

__block说明符

实际上,自动变量值截获只能保存执行Blcok语法瞬间的值.保存后就不能改写该值.若想在block语法表达式中将值赋给Blcok语法外声明的自动变量,需要在该自动变量上附加__block说明符.例子如下

<pre>
__block int var= 0;
void (^blk) (void ) = ^ {var = 1;};
blk ( );
</pre>

截获OC 对象,调用变更对象的方法也会产生错误吗?

<pre>id array = [NSMUtableArray alloc]init; void (^blk)(void) = ^{ id obj = [NSOBject alloc]init; [array addObject:obj]; }</pre>
这是没有问题的,而向截获的变量array赋值会产生错误.虽然赋值给截获变量array的操作会产生编译错误,但使用截获的值却不会有任何问题.这种情况下,需要给截获的自动变量附加__block 说明符

<pre>
__blcok id Array= [NSMutableArray alloc]init;
void (^blk)(void) = ^ {

Array = [NSMutableArray alloc]init;
};

</pre>

上一篇下一篇

猜你喜欢

热点阅读