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

  • 相关阅读:
    IOS-UI- UIScrollView 滚动视图(1)
    git实用攻略(二)
    git实用攻略
    一些技术发展和职业规划的建议
    Spring Data JPA 事务
    配置Slf4j依赖,桥接各种多个日志组件(排除commons-logging依赖的影响)
    Apache Shiro去掉URL中的JSESSIONID
    浏览器缓存介绍之sessionStorage、localStorage、Cookie
    【转】大数据批处理框架 Spring Batch全面解析
    ssl和https协议详解
  • 原文地址:https://www.cnblogs.com/lushengcao/p/4916971.html
Copyright © 2011-2022 走看看