Objective-C中的Block(闭包)

Objective-C中的Block(闭包)

转载自 http://ios.jobbole.com/83229/


Block基础部分

1.Block的声明

Block的定义和函数的声明差不多,就是把函数名改成(^blockName)即可。下面是block声明的代码。

有返回值的

无返回值的

2.给block块赋值

给声明好的block,赋值。block的值就是个函数体,给block块赋值有两种方式,一个在声明的时候赋值,一个是先声明在赋值。

先声明再赋值

在声明的时候赋值

3.调用block

block的使用和普通函数的使用相同,调用方法如下:

4.把block当做参数传入函数

5.在代码块中使用局部变量和全局变量

在block中可以和对全局变量进行访问和修改,但对局部变量只可以访问,若想修改的话,我们可以在声明局部变量的时候加上关键字__block

代码如下:

Block进阶 参考博客:http://www.cnblogs.com/NarutoYq/

下面的这些内容是参考上面的博客进一步学习的Block的内容,代码是参考这上面的博客自己写的,也就是说下面的东西算是伪原创吧。小伙伴们如果没大看懂下面的东西,请去上面的博客中进一部的了解一下block.

1.局部变量可变对象和不可变对象在block中的引用

下面会提供一部代码,这部分代码的功能是定义两个局部变量,一个是可变对象,一个是不可变对象,然后再定义一个Block, 在block中引用两个局部变量。上面提到了在代码块中可以引用局部变量但是不可以更改其值,除非在声明的时候加上__block关键字。

测试代码如下:

代码说明:给定义的各一个可变和不可变的对象一个初始值,然后在调用代码块的时候修改两个局部变量的值,然后再代码块中显示变量的值。

运行结果如下:

从上面的输出结果我们可以看到,在代码块中输出的不可变对象是原有的值,而不是我们改后的值,地址也是初始的地址。而对于可变对象,值是我们修改后的值,而地址使用原有的地址。如果要想block和不可变局部变量绑定的话,我们要加上_block

还是引用上面博客中的一段话来做一下总结吧:

  1. 对值类型的修改,如果block初始化后,无法同步到block内部

  2. 对于引用类型的修改,如果block初始化后,修改指针指向,即指向另外一块内存,这样也是无法同步到block内部

  3. 对于引用类型的修改,如果block初始化后,对指针指向的内存进行修改,即NSMutableArray add 、remove操作,这样是可以用同步到block内部,但block内部同样无法修改。

2.成员变量在block中的使用

成员变量在block中的使用是加上self->a使用的,所以在声明成员变量的时候加不加__block,在成员函数中的代码块中都可以访问修改;

​代码走起:

​interface:

​方法的实现:

输出结果:

总结:

  1. 对于一个、多个成员变量,不管是否用__block修饰(用不用都没任何影响),block结构体会生成一个成员 :self,并且会引用成员变量所属的对象实例 self。

  2. 对于成员变量的修改都是通过对象self指针引用来实现的。

  3. block内部对于成员变量的访问也是通过block结构体对象的成员self 指针引用来实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值