{Ws看官网文档}Block-变量传递(二)


  • 写在前面: 翻翻各个iOS大牛的博客,或者在他们回答新手如何学习iOS开发时,"多看,一定要看苹果官方文档"这句话100%会出现."苹果人家是权威,多少博客都是翻译一遍罢了""不要啃人家嚼过的甘蔗".理都懂,然并卵.就结合自己情况来说,之前也看的不多原因有三:
  • 1.中文看着多舒服,人忙忙的,问题解决就ok,想那多干啥
  • 2.卧槽,密密麻麻这是啥,看两行吓得我电脑都关上了
  • 3.问问自己的定位,你是不是一位合格并且有上进心的开发者?

其实对于大多数开发者来说,入了门之后,耳濡目染的都会写,认识些英文,所以其实还是一个懒,这句话也在说自己. 时光恍恍惚惚时间就这么没了,maybe失去些东西会让人突然安静下来.学习iOS一直自己做笔记,翻了翻自己的笔记,有些概念模模糊糊模棱两可,觉得是时候总结一波了.不想做咸鱼的我也就在这时候静下心来,看了一晚上苹果官网文档,对,是一晚上.不会的单词右击Look up, 复杂些的google.很恶心自己英文下降很多,但是观后感是:卧槽,这玩意才是武功秘籍好伐, 不管是guide还是一些api说明,实例code,绝逼权威,个人也觉得不会比一些中博客"翻译"过来的难理解. 一晚上,"soga...原来是这样!""这个这么理解才对""妈蛋,吃了这么久的二手甘蔗",是我整个心理活动.
当然夸张了, 只是觉得一是静下心来认真那种感觉很难得,二是官方文档真的很好.

这个集我想着自己尽量多的总结下官方文档的原文内容(不会大段落的翻译),带着自己(如果能帮到你就更好啦), 咱们去吃一手货!!


英文全部来自官方文档iOS9.1Document ,如果有错误,可能是复制或者打字错误, 开局了:

    1. Blocks Can Capture Values from the Enclosing Scope

(先别急着翻译,看下下面的这两个方法,猜下输出先.)
As well as containing executable code, a block also has the ability to capture state from its enclosing scope.
If you declare a block literal from within a method, for example, it’s possible to capture any of the values accessible within the scope of that method, like this:

- (void)testMethod {
    int anInteger = 42;
 
    void (^testBlock)(void) = ^{
        NSLog(@"Integer is: %i", anInteger);
    };
 
    testBlock();
}

In this example, anInteger is declared outside of the block, but the value is captured when the block is defined.

Only the value is captured, unless you specify otherwise. This means that if you change the external value of the variable between the time you define the block and the time it’s invoked, like this:

int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();

the value captured by the block is unaffected. This means that the log output would still show:

Integer is: 42      //输出是42```
It also means that the block cannot change the value of the original variable, or even the captured value (it’s captured as a const variable).
```objc
这里来总结文档意思: 不仅可以包含可执行代码一样,block能力超群,可以从封闭范围内获取值. 
其实道理很简单,答案应该有2种: 42 ,84 
42是觉得,可以的,不过这里是值传递
84觉得,外面修改了,我里面也用了,有可能吧.

随后文档给了解释: 除非你特殊定义,不然这个局部变量存在Block中后,后面你修改,它内部value是不影响的.
就像const来修饰一个变量,让它只读!

问题来了,那么怎样叫特殊定义,怎样可以修改? 来接下来就有解释了.
  1. Use __block Variables to Share Storage(这个标题自己翻译下)

If you need to be able to change the value of a captured variable from within a block, you can use the __block storage type modifier on the original variable declaration. This means that the variable lives in storage that is shared between the lexical scope of the original variable and any blocks declared within that scope.

As an example, you might rewrite the previous example like this:

__block int anInteger = 42;

void (^testBlock)(void) = ^{
    NSLog(@"Integer is: %i", anInteger);
};

anInteger = 84;

testBlock();

Because anInteger is declared as a __block variable, its storage is shared with the block declaration. This means that the log output would now show:

Integer is: 84   //这里输出就成84了
也就是说,用__block修饰变量,外部修改了这个变量,那么block里用得时候,就得注意了,值就变了.
用歪果仁的原文就是,Because anInteger is declared as a __block variable,
its storage is shared with the block declaration,分享给了你,这思维咋翻译嘛....
也就可以理解为,指针传递,带了__block这个修饰变量,外面修改,里面也会改

It also means that the block can modify the original value, like this:
(在看看这个:)

__block int anInteger = 42;

  void (^testBlock)(void) = ^{
      NSLog(@"Integer is: %i", anInteger);
      anInteger = 100;
  };

  testBlock();
  NSLog(@"Value of original variable is now: %i", anInteger);
This time, the output would show:

输出分别是:
Integer is: 42
Value of original variable is now: 100

  • 也就意味者,外部修改变量,会影响block调用时它的值,同时block内部也可以修改,有执行顺序,猜猜那么下段怎么输出.
- (void)text {
    
    __block int a = 10;
    
    void(^block)() = ^void() {
        a = 20;   //先修改a
        NSLog(@"a = %d",a);
        
    };
    
    block();
    
    NSLog(@" new a = %d",a);
    
}

//没错,内部是按顺序执行的,   a = 20   ,new a = 20
  • 我也很疑惑,为什么加上_ block就可以了,是不是变量作用域的问题. 那么我就不加 _block,而是把a修饰成全局的试试? 加上static是什么效果? 自己去试试吧,下面是结果.
int a = 10;

- (void)text {
    
    
    void(^block)() = ^void() {
        a = 30;
        NSLog(@"%d",a);
        
    };
        a = 20;
    
    block();
    
    NSLog(@" new a = %d",a); 
  /* 输出a = 30; new a = 30; 所以执行顺序就明白了:
     先到a = 20; 然后进block
  */
--------------------------------------------
- (void)text2 {
    
    static int a = 5;
    void(^block)() = ^void() {
        
        NSLog(@"%d",a);
        
    };
    a = 20;
    
    block();
    
    NSLog(@" new a = %d",a);
      /* 输出a = 20; new a = 20; 所以执行顺序就明白了:
     先到a = 20; 然后进block
  */
------------------------------
- (void)text3 {
    
    static int a = 5;
    void(^block)() = ^void() {
        a = 30;
        NSLog(@"%d",a);
        
    };
    a = 20;
    
    block();
    
    NSLog(@" new a = %d",a);
    //输出 a = 30;  new a = 30;
}

所以苹果这里说__block的意义在于,1. 在一个函数中,它不仅可以保存代码块
更是可以跳出那个{},获取外面的值  2.加上__block后,更是在block块儿内获取外面值得时候,先修改,再存入,
同时block内可以修改这个变量值,这里思想就不会禁锢在变量的作用域上.而是说Block的特性
所以不纠结其他的,总结block下就是两种传递:
1.值传递
2.指针传递.  为啥这么叫,用clang再编译下,然后查找对应传递,就会明白啦! 
不加__block,传的是值
加上__block,是指针
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,392评论 0 23
  • 我觉得所谓的结束,不过是暂时告一段落,并无太大意义,就如同活着一样。并非因为有了结束,过程才有意义,而是为了便宜的...
    爱斯基摩人we阅读 839评论 0 0
  • 人在一定的年龄段会有一定的变化,等你过了那个年龄段,就会觉得自己以前多么可笑
    HANZIQIANG阅读 48评论 0 1
  • 愿你三冬暖,愿你春不寒; 愿你天黑有灯,下雨有伞; 愿你一路上,有良人陪伴; 愿你翻山越岭都有人想念; 愿你一路风...
    灰兮阅读 258评论 0 0
  • 这个系列的文章是我最想写的东西之一,却也是最不会写的东西。创作它的想法萌发于某次国际处值班,无聊的我刷知乎刷到了田...
    冰镇冰水阅读 454评论 0 1