文档章节

block 的变量使用

木木情深
 木木情深
发布于 2015/04/09 15:54
字数 659
阅读 18
收藏 0
点赞 0
评论 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
广州
程序员
iOS——Block笔记

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

kinglin_fu
2016/01/13
93
0
(四)Block之 __block修饰符及其存储域

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

madaoCN
2017/10/21
0
0
iOS - block语法块

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

水一样的人儿
2015/12/23
72
0
Block 在不同情况下的变量存储区域

一.如果只使用全局或静态变量或不使用外部变量, 那么Block块的代码会存储在全局区; 二.如果使用了外部变量, 在ARC中, Block块的代码会存储在堆区; 在MRC中, Block快的代码会存储在栈区; 三....

JasonMs
2015/09/05
405
0
正确使用Block避免Cycle Retain和Crash

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

hejunbinlan
2016/06/07
26
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块的内存管理,及解决循环引用的方法

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

fengyun321
2015/09/14
140
0
iOS中block的使用

一、block简介 block代码块是在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,blcok还可以保存一段代码,在...

勤劳的小QQ
2017/04/21
0
0
【block】深入理解block

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

创意总监
2016/06/08
40
0
老生常谈之Block

前面有一篇介绍Block的博客,主要介绍了Block的简单使用技巧。这篇博客主要更加深入地了解一下Block。包括:Block的实现、Block的原理以及Block的存储域三方面。 Block的实现 首先我们使用X...

kakarotto
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

命令

sudo nginx -s reload 重启nginx sudo lsof -i -P | grep -i "listen" 查看端口占用

那个猴子
2分钟前
0
0
用scrapy-redis爬去新浪-以及把数据存储到

需求:爬取新浪网导航页(http://news.sina.com.cn/guide/)所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。 准备工作: a.安装redis(windows或者linux) b.安装Redis Des...

丁典
2分钟前
0
0
PHP常用函数篇

1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复代码,只需调用...

天地有涯风有信_大海无量不见人
3分钟前
0
0
对List分组

在日常工作中会遇到这样的情景,我们需要对List按照List中对象的一个值进行分组。比如一个Human的List,我们要根据性别分组,传统的方法是做双层循环,逐个对比,今天我要介绍一种详单简单的...

珂jack
4分钟前
0
0
分析jquery ajax jsonpCallback回调函数名包含点号报错问题

现象 项目中涉及到跨域请求,采用jquery ajax jsonp来实现,但是遇到一个奇怪问题,在设置回调函数名称时,若包含点号,如“Callback.Success”,那么执行完成后,其error回调函数始终会被触...

iwaller
8分钟前
0
0
【Graphql实践】使用 Apollo(iOS) 访问 Github 的 Graphql API

最近在协助调研 Apollo 生成的代码是否有可能跨 Query 共享模型的问题,虽然初步结论是不能,并不是预期的结果,但是在调研过程中积累的一些经验,有必要记录下。如果你也对 Graphql 感兴趣,...

ios122
8分钟前
1
0
聊聊spring cloud的AsyncLoadBalancerAutoConfiguration

序 本文主要研究一下AsyncLoadBalancerAutoConfiguration AsyncLoadBalancerAutoConfiguration spring-cloud-commons-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/client/loadba......

go4it
17分钟前
0
0
10.19 iptables规则备份和恢复 ,firewalld的9个zone,service的操作

保存和备份iptables规则 内容: 保存iptables规则 service iptables save 把iptables规则备份到my.ipt文件中: iptables-save > my.ipt 恢复刚才备份的规则: iptables-restore < my.ipt 1.......

Linux_老吴
20分钟前
0
0
Vue 自动化表单相关资料

1.使用vue自动化表单 2.Vue可视化,Vue代码生成,Vue动态表单 3.前端表单进阶之路:通过 Vue.js 实现表单可配置化 4.使用Vue动态生成form表单 5.autoform-devtool 6.Vue.js实践:实现多条件筛...

IT追寻者
21分钟前
0
0
动态SQL

一、动态SQL 1、if <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title l......

一个yuanbeth
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部