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

概要:本文主要介绍了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的内存占用有了更深刻的认识,还学会了自定义代码段来加速输入,真是受益匪浅!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值