温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

[iOS开发]推翻错误结论——“Block可以捕获它的声明所在相同作用域的状态。”

发布时间:2020-04-10 15:26:07 来源:网络 阅读:670 作者:developerPan 栏目:移动开发

最近看block,觉着好神奇。

尤其是block可以捕获自动变量值特性,简直是大杀器啊。

那么捕获的究竟是何时的自动变量呢?

各大技术博客与技术书籍统一口径:Block可以捕获它的声明所在相同作用域的状态。

真的是这样吗?

且跟我来试一试。


代码:

- (void)viewDidLoad

{

   int val=0;

   void (^blk)(NSInteger);  //声明block类型变量

   val = 1;               //在定义前重新赋值。

   blk=^(NSInteger a){

       NSLog(@"截获的val:%d",val);

       return;

   };

   val = 2;                //定义后,调用前重新赋值。

   blk(val);


}

声明前val=0;

声明后定义前val=1;

定义后调用前val=2;

打印出来的结果是什么呢??


2013-12-27 18:30:14.182 Test[2594:70b] 截获的val:1



所以得出结论:

Block可以捕获它的定义所在相同作用域的状态。而不是所谓的声明所在相同域的状态。

查阅苹果官方文档。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxOverview.html#//apple_ref/doc/uid/TP40007502-CH3-SW3

[iOS开发]推翻错误结论——“Block可以捕获它的声明所在相同作用域的状态。”

  • Can capture state from the lexical scope within which it is defined

(Block)可以捕获它的定义所在相同作用域的状态。

沉冤昭雪……


为什么网上会统一口径说捕获的是声明所在相同作用域呢?

顺藤摸瓜发现网上有人将这份关于block的苹果官方文档翻译成了中文…

翻译的还挺好的,就是这一句翻译错了……错将定义翻译成了声明(或者是不小心,或者是声明和定义概念没有搞清楚)

一传十十传百,关于block的诸多资料都是由这份错误翻译的文档演变而来的…

悲伤的是到现在还没有人来为其正名…

百度关于Block捕获的是何时的作用域清一色的全是错误结论……

[iOS开发]推翻错误结论——“Block可以捕获它的声明所在相同作用域的状态。”

坑爹呢这是!!


正确结论:

Block捕获的应该是它的定义所在相同作用域的状态。而不是所谓的声明所在相同域的状态。

大家对于网上的资料不要盲信,一要自己去试,二要警惕翻译错误挖的坑。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI