文档章节

block 的变量使用

木木情深
 木木情深
发布于 2015/04/09 15:54
字数 659
阅读 19
收藏 0

 说明:

 1. 指针变量\类成员变量\静态变量,在Block的内部实现中,是一种引用而非拷贝。

 2. 其他基本类型的变量,在Block的内部实现中,是一种拷贝。

 3. 局部变量在Block内部只读,在block外部修改变量值,也不影响编译时在block中初始化的值。

 4. 原本的变量i,block的内部重新定义了一个i并且在该结构体的构造函数进行赋值,也就是对i进行了一份拷贝。

 5. 指针变量p ,在block内部也有一个变量p,但是在构造函数的时候,它是指针地址的赋值,也就是说是一份引用。


代码运行示例:

typedef void ( ^ MyBlock )(void);

    

    

    __global_age = 20;                 //全局变量

    int outside_age=20;                //Block 外部的整形变量

    int *p_age = &outside_age;         //Block 外部的指针变量

    static int outside_static_age = 20;//block 外部静态整形变量

    

    

    MyBlock aBlock = ^(){       //start Block

        NSLog(@" class member variable:\tm_global_age = %d", __global_age);

        NSLog(@" class member variable:\tm_age = %d", self.m_age);

        NSLog(@" outside variable: \t\toutside_age = %d", outside_age);

        NSLog(@" outside point variable:p_age = %d", *p_age);

        NSLog(@" outside variable:\toutside_static_age = %d",outside_static_age

              );

        

        __global_age = 200;

        self.m_age = 200; //语句5

        *p_age = 200;     //语句6

//        -------outside_age = 200;//语句7: 一般的外部变量block内不具有写的权限 Variable is not assignable (missing __block type specifier)

        outside_static_age = 200;//语句8

        

        

        NSLog(@" block modify----class member variable:\tm_global_age = %d", __global_age);

        NSLog(@" block modify----class member variable:\tm_age = %d", self.m_age);

        NSLog(@" block modify----outside variable: \t\toutside_age = %d", outside_age);

        NSLog(@" block modify----outside point variable:p_age = %d", *p_age);

        NSLog(@" block modify----outside variable:\toutside_static_age = %d",outside_static_age

              );

        /*

         2015-04-09 09:51:26.155 BlockDemo[1553:60b]  block modify----class member variable: m_global_age = 200

         2015-04-09 09:51:26.155 BlockDemo[1553:60b]  block modify----class member variable: m_age = 200

         2015-04-09 09:51:26.156 BlockDemo[1553:60b]  block modify----outside variable: outside_age = 20

         2015-04-09 09:51:26.156 BlockDemo[1553:60b]  block modify----outside point variable:p_age = 200

         2015-04-09 09:51:26.156 BlockDemo[1553:60b]  block modify----outside variable: outside_static_age = 200


         */

        

    }; //end Block

    

    

    __global_age = 100;

    self.m_age = 100; //语句1

    *p_age = 100;     //语句2

    outside_age = 100;//语句3

    outside_static_age = 100;//语句4

    /*

     2015-04-08 17:48:11.420 BlockDemo[8563:60b]  class member variable: m_age = 100

     2015-04-08 17:48:11.422 BlockDemo[8563:60b]  outside variable: outside_age = 20

     2015-04-08 17:48:11.422 BlockDemo[8563:60b]  outside point variable:p_age = 100

     2015-04-08 17:48:11.423 BlockDemo[8563:60b]  outside variable: outside_static_age = 100

     */

    

    //如果去掉赋值的三句,结果如下

    /*

     2015-04-09 09:19:05.700 BlockDemo[1088:60b]  class member variable: m_age = 10

     2015-04-09 09:19:05.701 BlockDemo[1088:60b]  outside variable: outside_age = 20

     2015-04-09 09:19:05.702 BlockDemo[1088:60b]  outside point variable:p_age = 20

     2015-04-09 09:19:05.702 BlockDemo[1088:60b]  outside variable: outside_static_age = 20

     */

    

    aBlock();


附注:具体原理,请阅读block的闭包性的相关文章。

© 著作权归作者所有

共有 人打赏支持
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
(四)Block之 __block修饰符及其存储域

相关文章 (一)Block的实质初探 (二)Block之存储域 NSConcreteStackBlock,NSConcreteGlobalBlock,NSConcreteMallocBlock (三)Block之截获变量和对象 (四)Block之 _block修饰符及其存...

madaoCN
2017/10/21
0
0
IOS 学习---block块的内存管理,及解决循环引用的方法

在MRC环境下: block对局部变量的影响: 使用局部变量:a到block块中,为了在block中能够使用这个变量,将a拷贝放到常量区 域 int a = 10; 如果访问局部对象,为了在block中能够使用这个对象,...

fengyun321
2015/09/14
140
0
Objective-C中 Block 在iOS在4.0版本的使用

Objective-C中 Block 在iOS在4.0版本的使用 了解何谓block。 了解block的使用方法。 Block 是iOS在4.0版本之后新增的程序语法. 在iOS SDK 4.0之后,Block几乎出现在所有新版的API之中,换句话...

浩浩老师
2015/09/11
228
0
(iOS)如果你使用过block,最好看一下这篇文章

首先,本文并不会涉及太多block的源码,更多的是block使用方面的一些东西。 新人写文,如有错误,敬请斧正! 原理 使用也好认识也好,首要任务就是搞懂block到底是个什么东西,其中的内容我们...

Perfect_dream
2017/11/24
0
0
【block】深入理解block

block究竟是怎么的情况 了解Block 你不知道的 外部变量的存取 注:BLOCK被另一个BLOCK使用 参考链接

创意总监
2016/06/08
40
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
2
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
3
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linuxCool
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部