在使用block的过程中经常会调用不同类型、不同作用域的变量,如果对这些变量作用域的理解稍有偏差,就会出现问题。故此特意整理出block中会经常使用到的几种变量,如有补充,欢迎指出。

1. 局部变量

局部变量会在代码块创建时复制一份并保存为常量。为了帮助理解,先看一段代码:

    typedef double (^SampleMultiplyBlockRef)();

    double a = 10, b = 20;
SampleMultiplyBlockRef multiply = ^(){
return a * b;
};
NSLog(@"%f", multiply()); //200
a = 20, b = 50;
NSLog(@"%f", multiply()); /200

  代码块中的变量a和变量b实际上只是copy了局部变量a和b的值,之后即使局部变量a和b改变了,代码块内部的a和b的值并不会随着改变。

2. 全局变量

全局变量与block拥有相同的作用域。看代码:

    typedef double (^SampleMultiplyBlockRef)();

    static double a = 10, b = 20;
SampleMultiplyBlockRef multiply = ^(){
return a * b;
};
NSLog(@"%f", multiply()); //200
a = 20, b = 50;
NSLog(@"%f", multiply()); //1000

3.__block变量

局部变量会被代码块作为常量获取到,如果想要在代码块中改变局部变量的值,必须使用__block 修饰符。

     typedef void (^SampleMultiplyBlockRef)();

     double a = 10, b = 20;
__block double c;
SampleMultiplyBlockRef multiply = ^(){
c = a * b;
};
multiply();
NSLog(@"%f", c);

  此处如果不使用__block修饰符,编译器将会出现警告:Variable is not assignable (missing __block type specifier)

Block之变量作用域的更多相关文章

  1. block没那么难(二):block和变量的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  2. 【JavaScript 从零开始】变量作用域

    变量作用域 一个变量的作用域(scope)是程序源代码中定义这个变量的区域. 全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只是函数体内有定义. 他 ...

  3. perl学习之六:变量作用域

    变量作用域 (一)包变量 $x = 1 这里,$x是个包变量.关于包变量,有2件重要的事情要了解: 1)假如没有其他申明,变量就是包变量:2)包变量总是全局的. 全局意味着包变量在每个程序里总可访问到 ...

  4. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  5. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  6. Java基础知识笔记(七:接口、变量作用域和参数传递)

    一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格 ...

  7. PHP常量、变量作用域详解(一)

    PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...

  8. PHP变量作用域详解(二)

    学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...

  9. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

随机推荐

  1. Hibernate validator验证

    spring-mvc配置 <mvc:annotation-driven validator="validator" /> <bean id="valid ...

  2. 对rsync进行封装的shell脚本

    抓取 #!/bin/bash . push.sh # 错误处理:尝试查找备份文件 function onError() { local errFile="err" local se ...

  3. GetSystemMetrics() 函数的用法

    可以用GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获 ...

  4. C#委托(Delegate)学习日记

    在.NET平台下,委托类型用来定义和响应应用程序中的回调.事实上,.NET委托类型是一个类型安全的对象,指向可以以后调用的其他方法.和传统的C++函数指针不同,.NET委托是内置支持多路广播和异步方法 ...

  5. Hadoop 学习笔记 (十一) MapReduce 求平均成绩

    china:张三 78李四 89王五 96赵六 67english张三 80李四 82王五    84赵六 86math张三 88李四 99王五 66赵六 77 import java.io.IOEx ...

  6. Android开源项目发现----其他特殊效果篇(持续更新)

    1. Crouton 丰富样式的Toast 允许alert.comfirm.info样式及点击消失样式,允许设置Toast显示时间,允许自定义View. 项目地址:https://github.com ...

  7. [LeetCode#260]Single Number III

    Problem: Given an array of numbers nums, in which exactly two elements appear only once and all the ...

  8. Java判断空字符串

    今天碰到java中去判断String是否为空字符串的时候,用了S.length() ==0, s.equals(null), s.isEmpty(), 都失败. 后来用S.trim().equals( ...

  9. Linux Kernel TUNSETIFF释放后重用本地拒绝服务漏洞(CVE-2013-4343)

    漏洞版本: Linux kernel <= 3.11 漏洞描述: BUGTRAQ ID: 62360 CVE(CAN) ID: CVE-2013-4343 Linux Kernel是Linux操 ...

  10. Shell上传文件到ftp

    写一个shell文件,将给定的文件上传到指定的ftp. 代码如下: #!/bin/bash #用来将文件上传到ftp,输入参数:文件名(包括路径).ftp的IP.ftp的端口.用户名.密码 ip=$ ...