005.block_基础语法

一.block简介

block即块,与函数类似,只不过是直接定义在一个函数里的,block和定义TA的那个函数共享一个范围内的东西。block其实就是个值,而且自有其相关类型,既然是个值当然就可以把块赋值给变量,然后像使用其他变量那样使用它。

二.block格式

block和c的函数格式对比如下:

第一,block变量名写在小括号里,之前价格插入符

第二,block参数列表后是等于号"=",和插入符"^"

第三,block的花括号后,有个分号

int (^blockName)(int a,int b) = ^{return a + b;};  //block

int functionName(int a,int b)     {return a + b;}     // c函数

三.block示例

1.block内访问函数内变量

int additional = 5;

int(^addBlock)(int a,int b) = ^(int a,int b){return a + b + additional;};

int add = addBlock(2,5); //add = 12

2.block内,如若修改函数内且block外的变量,需要在定义的变量前加 __block修饰(下面这个块来枚举数组中的元素,判断其中多少个小于2的数)。

NSArray *array = @[@0,@1,@2,@3,@4,@5];

__block NSInteger count = 0;

[array enumerateObjectsUsingBlock:^(NSNumber *number, NSUInteger idx, BOOL *stop) {

if ([number compare:@3] == NSOrderedAscending) {

count ++;

}

}];

NSLog(@"count = %ld",count); // count = 2;

 在上面,传给enumerateObjectsUsingBlock:方法的参数---块,并未先赋值给局部变量,而是直接内联在函数调用里了,这就是“内联块(inline block)”的用

 法。由代码中可以看出,使用了内联块,所有的业务逻辑被放在了一起,代码也更紧凑。

3.若block捕获的变量是对象类型,那么就会自动保留它,在系统释放块的时候也会将对象一起释放,由此可见,block本身也可以视为对象,block也有引用计数。

block与实例变量的关联见 P151页...

4.block分为3类,堆block,栈block,全局block,这里介绍下全局block

全局block(global block)不会捕捉任何状态(如外围的变量等),运行时也没有状态参与,块所使用的整个内存区域在编译期已经完全确定,global block可以声明在全局内存里,而不需要每次用到的时候从栈中创建,如下是个global block

void(^aBlock)() = ^{NSLog(@"这是一个global block")};

5.为block类型创建typedef

block类型写起来有些麻烦,可以使用typedef为block起个易读的别名,语句如下:

typedef int(^EOCSomeBlock)(Bool flag,int value); //声明block和定义新类型时,语法一样

而使用时,就可以直接使用新类型即可:

EOCSomeBlock block = ^(Bool flag,int value){

// Implementation

};

参照资源:
1.《Effective Objective-C 2.0》

时间: 2024-11-13 04:08:08

005.block_基础语法的相关文章

前端学PHP之正则表达式基础语法

前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述.正则表达式有三个作用:1.匹配,也常常用于从字符串中析取信息:2.用新文本代替匹配文本:3.将一个字符串拆分为一组更小的信息块.本文将详细介绍PHP中的正则表达式基础语法 [注意]关于javascript的正则表达式的详细信息移步至此 历史 在PHP中有两套正则表达式函数库,两者功

Java基础语法

Java的基础语法中包含字符集.标识符和关键字.变量和常量.语句.注释.运算符和表达式这些基本要素. 一.关键字 编程语言都有一些保留的单词,用于定义该语言,这些单词对于编译器有特殊含义,不能作为标识符使用: Java中的true.false.null这三个保留字,不能作为标识符使用,对于编译器有特殊含义: main是一个用于描述Java程序开始方法的特殊名称,它不是一个关键字: abstract 抽象 boolean 逻辑运算: 布尔 break 打破: 断开 byte 字节: case 例,

关于JS脚本语言的基础语法

JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱类型语言: 开始时要嵌入JS代码:<script type="text/javascript"></script>: 关于写程序是需注意的基本语法:1.所有的字符全都是英文半角的:2.大部分情况下每条语句结束后要加分号:3.每一块代码结束后加换行:4.程序前呼后应:

java 基础语法

第一周接触java基础语法,上课听得头痛,还是半懂不懂,放学后讲的啥子都忘了. 这是老师给的周末作业: 1.输入长与宽计算长方形面积与周长.(用精度类型计算)2.输入一个学生三科成绩,计算平均分.3.输入int型市场价格,购买价格,计算差额,差额显示为单精度浮点型.4.42页第二,计算房贷那道题.5.输入一个学生成绩,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.6.题目:输入三个整数x,y,z,请把这三个数由小到大输出.程序分析:我们想办法把最小的数放到x

jQuery安装和基础语法

1.安装 从 jquery.com 下载 jQuery 库 <script src="jquery-1.10.2.min.js"></script> 从 CDN 中载入 jQuery <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> 许多用户在访问其他站点时,已经从百度.又拍云.新浪.谷歌或微软加载过 jQuery.所有结

javascript基础语法——词法结构

× 目录 [1]java [2]定义 [3]大小写[4]保留字[5]注释[6]空白[7]分号 前面的话 javascript是一门简单的语言,也是一门复杂的语言.说它简单,是因为学会使用它只需片刻功夫:而说它复杂,是因为要真正掌握它则需要数年时间.实际上,前端工程师很大程度上就是指javascript工程师.前端入门容易精通难,说的是前端,更指的是javascript.本文是javascript基础语法的第一篇——词法结构 与java关系 关于javascript有这样一个说法,java和jav

【MOOC笔记】JSP基础语法

JSP 全名:Java Server Pages.java服务器端页面. 本质上是一个简化的Servlet设计,实现了在java中使用HTML标签. JSP是一种动态网站开发标准,与Servlet一样,在服务器端执行. 常用动态网站开发技术: JSP:JAVA平台,安全性高,适合开发大型.企业级WEB应用程序. ASP.NET:基于可视化组件开发,安全性.跨平台性差,最好用微软配套系统. PHP:适合中小型企业WEB应用开发,黄金开发组合:Linux+Apache+MySQL+PHP JSP基础

IOS_OC_基础语法

1.YES与NO Object-c 提供了 BOOL 类型, 但这个BOOL 类型和 C++里的并不一样: 在C++里一切非 0 值的东西都 为 true,而为 0 值的为 false.但是 Object-c 里 1 为 true 并被宏定义为 YES=1,0 为 false 并被宏定义为 NO=0. + (BOOL)isEquals:(int)x with:(int)y { return x - y; } if ([Provider isEquals:10 with:1021]) {// ==

less以及SCSS基础语法

less 1.注释: //这种注释不能够编译到CSS 文件中 /*这种注释 能够编译到CSS 文件中*/ 2.less 的基础语法 (1).声明变量: @变量名 : 变量值 使用变量: @变量名 >>>变量使用的基本原则: 多次频繁出现的值,后期需要统一修改的值,牵扯到数值运算的值,推荐使用变量 >>>less 中的变量类型 ①数值类: 不带单位的 123, 带单位的 1px ②字符串类型: 不带引号的 red #FF0000 带引号的"hahhaha&quo