美文网首页
block特性:截取自动变量值

block特性:截取自动变量值

作者: 有一种再见叫青春 | 来源:发表于2016-11-16 11:06 被阅读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>

相关文章

  • block特性:截取自动变量值

    blcok是带有自动变量值的匿名函数."带有自动变量值"在block中表现为"截取自动变量值".实例如下 int ...

  • Block实现原理

    Block是带有自动变量值的匿名函数; 带有自动变量值在Block中表现为截获自动变量值; 自动变量值截获只能保存...

  • Block(匿名函数)

    一、语法格式 二、截获自动变量值和__block修饰符 block的自动变量截获只针对block中使用的自动变量。...

  • iOS Block理解

    1、什么是Block 2、Block语法 3、Block类型变量 4、截获自动变量值 5、__block说明符 6...

  • __block

    __ block Block中所使用的被截获自动变量就如“带有自动变量值的匿名函数”所说,仅截获自动变量的值,Bl...

  • block的深度探究(截取自动变量、__block、截获对象、存

    本章目录 Block截取自动变量 __block说明符 Block存储域 __block变量存储域 Block中截...

  • Objective-C Block 笔记二-Blocks的实现

    Block 的实质 Block 是“带有自动变量值的匿名函数”,我们可以通过 Block 的实现来加深理解。首先通...

  • Block源码解析和深入理解

    Block源码解析和深入理解 Block的本质 Block是"带有自动变量值的匿名函数". 我们通过Clang(L...

  • block

    block是C语言的扩充功能。带有自动变量的匿名函数 截获自动变量值保存该自动变量的瞬间值 block语法表达式中...

  • 第二章 2.2.3 截获自动变量值

    通过上面两节,Block语法与Block类型变量,可以理解“带有自动变量值的匿名函数”中“匿名函数”。而“带有自动...

网友评论

      本文标题: block特性:截取自动变量值

      本文链接:https://www.haomeiwen.com/subject/sjtrpttx.html