文档章节

block 的变量使用

木木情深
 木木情深
发布于 2015/04/09 15:54
字数 659
阅读 18
收藏 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笔记

1、block的基本概念和语法 基本概念: block叫代码块、闭包或者匿名函数。包含返回值类型、block标记、名称、参数和主体,类似C语言的函数。它本质上是可移植的匿名函数,可作为方法和函数的...

kinglin_fu
2016/01/13
93
0
iOS - block语法块

block语法块,类似于方法,分为无返回值无参数,有返回值有参数,有返回值无参数,有返回值有参数。block的声明,block的调用。block整体作为属性,block整体作为函数中的参数的使用。 把blo...

水一样的人儿
2015/12/23
72
0
IOS 学习---block块的内存管理,及解决循环引用的方法

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

fengyun321
2015/09/14
140
0
正确使用Block避免Cycle Retain和Crash

Block简介 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是...

hejunbinlan
2016/06/07
26
0

没有更多内容

加载失败,请刷新页面

加载更多

造谣造到t-io老巢了

只发当事人的截图,不发表评论,以免有引导嫌疑 PS1:截图是由不同的人发给我的 PS2:本人早就不在此微信群了 PS3:图3是2018-09-23的t-io官方群的一个发言小统计

talent-tan
8分钟前
15
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
42分钟前
1
0
Spring 转换 model 为 json 时增加属性

缘起 目前的项目中有个需求是在附件对象转换成 json 时增加个 url 属性,以前的方式是在返回附件对象或列表时候做一次统一处理,这次想看看 spring 或者 jackson fasterxml 是否自带类似功能...

郁也风
今天
1
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
今天
1
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部