您的位置:首页 > 移动开发 > IOS开发

iOS概念入门学习-Foundation框架-Block

2015-08-16 17:40 253 查看
概要:本文主要介绍了block的基本用法,和使用场景,作为OC新增的特性,很多时候block能比函数更加灵活地完成一些特定的任务。

一、block的基本概念

1.block的基本概念

Block对象是一个C级别的语法和运行机制。它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,Block对象包含着一组状态数据, 这些数据在程序执行时用于对行为产生影响。

2.block的基本用法



用^操作符来声明一个Block变量,并指明Block述句的开始。Block的主体部分包含在{}内,像下面的例子中一样(与C语法一样,“;”指明语句的结束):

结构特点:

- 1.类型比函数定义多了一个 ^

- 2.设置数值,有一个 ^,内容是 {} 括起的一段代码`

(1)无参无返回值的block定义和使用

定义格式:
void (^block名)() = ^{代码块;}
使用格式:
block名();




(2)有参数无返回值的block的定义和使用

定义格式:
void (^block名称)(参数列表) = ^ (参数列表) { // 代码实现; }
使用格式:
block名(参数1,参数2)




(3)有参数有返回值的block的定义和使用

定义格式:
返回类型 (^block名称)(参数列表) = ^ 返回类型 (参数列表) { // 代码实现; }
使用格式:
返回值类型 接受变量=block(参数1,参数2)




二、block的用法

1.block与typedef

可以使用typedef定义一个Block的类型,便于在后续直接使用

格式:

typedef  返回值类型 (^block变量名)(参数类型列表);


如:
typedef int(^MyBlock)(int ,int);




说明:

- 1. typedef是关键字用于定义类型,MyBlock是定义的Block类型

- 2. area、sum分别是MyBlock类型的两个Block变量

特别注意:尽管typedef可以简化Block的定义,但在实际开发中并不会频繁使用typedef关键字,这是因为Block具有非常强的灵活性,尤其在以参数传递时,使用Block的目的就是为了立即使用。但是当block作为函数的返回值时,我们就会用到typedef了,这点将在下个知识点详细说明。

2.block访问外部变量

(1)在block内部可以使用外部变量, 但是注意,这是一个新的内存空间变量。如下图:



不但地址不同,且不在同一个地址区域内。block外的变量a地址在栈区,block内的a地址在代码区

(2)block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部变量的作用域 ,如下图:



神奇的一幕发生了,虽然block内外的a地地址不同,但他们都在栈区,可见block内重新定义的过程中,给a在栈区开辟了一块内存空间,而刚才的那种情况a只是一段block代码而已,并没有开辟新的空间,所以刚才block内的a他的内存空间在代码区。

(3)默认情况下,Block内部不能修改外部的局部变量



按照刚才的思路继续往下推理,之所以不能修改外部的局部变量是因为block内部并不知道a所指向的栈区的内存空间,所以无法修改!!!

(4)给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。



有点像做过特殊处理一样的感觉。。。block内的a所占内存空间依旧在代码区。

block应用实例:







3.block作为函数的返回值

上文说过,当我们把block作为函数的返回值的时候,typedef就是必须的了,下面我们来看具体方法。

步骤:

- (1)使用typedef 定义一个新的类型

- (2)使用新类型作为函数的返回值

- (3)定义变量接收函数返回的值(block类型)

- (4)调用block

实例如下:



4.block的其他用法

数组遍历



5.block的使用技巧和注意

(1)block 结构的快速提示 :

输入inlineBlock得到提示:



神技!不解释,另外还可以根据自己习惯自定义代码块的快捷键,实在是太方便了!

(2)block变量用作方法的参数

block变量用作方法参数的时候只需要输入前面几个字母就会弹出提示,直接敲回车确认,再修改参数即可。

(3)block和函数的区别

1.定义方式不一样;

2.block是一种数据类型;

3.函数不可以嵌套使用,block可以嵌套使用;

4.block因为是数据类型,所以可以作为函数的参数和返回值;

5.函数则不可以作为函数的参数或者返回值。

总结:学习完block之后我十分惊叹于它的灵活,特别是探究block访问外部变量的过程中,还让我对block的内存占用有了更深刻的认识,还学会了自定义代码段来加速输入,真是受益匪浅!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: