zoukankan      html  css  js  c++  java
  • block的一点知识

     

    一个block的笔记: http://www.cnblogs.com/xinye/archive/2013/03/03/2941203.html

    http://segmentfault.com/q/1010000000182523

    在一个比较专业的人的博客中发现

    Blocks可以访问局部变量,但是不能修改。

                  int multiplier = 7;
         int (^myBlock)(int) = ^(int num) {
             multiplier ++;//编译报错
             return num * multiplier;
         };

    如果要修改就要加关键字:__block

          __block int multiplier = 7;
         int (^myBlock)(int) = ^(int num) {
             multiplier ++;//这样就可以了
             return num * multiplier;
         };

    但是他下面又是这样写的

    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
        NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
        [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
            [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
        }];
       
        NSLog(@"%@",mArrayCount);

    问,这样结果也是出来了,到底对还是不对

    简单说就是 栈变量才受影响 堆变量不受影响你给的例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

    这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

    但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

    http://www.cnblogs.com/xinye/archive/...这里说的比较详细

    http://www.cnblogs.com/xinye/archive/2013/03/03/2941203.html

  • 相关阅读:
    SoapUI 使用笔记
    git 使用笔记(二)
    git 使用笔记(一)
    jquery 拓展
    hdu 1024 Max Sum Plus Plus (DP)
    hdu 2602 Bone Collector (01背包)
    hdu 1688 Sightseeing (最短路径)
    hdu 3191 How Many Paths Are There (次短路径数)
    hdu 2722 Here We Go(relians) Again (最短路径)
    hdu 1596 find the safest road (最短路径)
  • 原文地址:https://www.cnblogs.com/lushengcao/p/4916971.html
Copyright © 2011-2022 走看看