一.block简介
1.block是一段代码块,是对c语言的拓展,用来封装或者存储代码,与函数类似,可以在需要的时候需要的文件中调用
2.block分为有参数有返回值,有参数无返回值,无参数有返回值,无参数无返回值.
block的声明格式:
![](https://img.haomeiwen.com/i2916190/6a42568878bb1e6e.png)
//无参数无返回值
![](https://img.haomeiwen.com/i2916190/b52240531e93b267.png)
![](https://img.haomeiwen.com/i2916190/5788b74a10834be6.png)
有参数的block可以有多个参数,参数之间使用“,”隔开。
此时run程序会发现并不会有打印结果,必须要调用之后才能执行block的代码块
block的调用
![](https://img.haomeiwen.com/i2916190/a1df3bbdeffb54b4.png)
![](https://img.haomeiwen.com/i2916190/e33f3e11341409a2.png)
3.在block内部可以访问外部变量,默认情况下不可以修改此外部变量的值:
![](https://img.haomeiwen.com/i2916190/3ce394c38351eb2a.png)
如果想要在block内部修改外部变量需要用__block修饰外部变量
![](https://img.haomeiwen.com/i2916190/5db5d70abb317671.png)
4.利用类型定义定义block,这样可以写起来更简单、方便
![](https://img.haomeiwen.com/i2916190/958a5f11c4aace90.png)
![](https://img.haomeiwen.com/i2916190/cb72aa3b1a8bd6b2.png)
二.block使用场景
1.block属性,可以在类之间传递一段代码并实现回调功能
新建一个Person类并声明一个block类型的属性
![](https://img.haomeiwen.com/i2916190/dc378366c1e1f753.png)
可以在Person的init方法中或者viewcontroller类中给这个block封装一段代码,然后调用。
本文在viewcontroller类中封装,在Person中可以实现调用,就起到了类和类之间传递信息的作用
![](https://img.haomeiwen.com/i2916190/2fd53099dba64dae.png)
2.block可以作方法的参数,AFNetworking库中的请求方法中一般都有block的参数,本文中将给Person类添加一个带有block参数的方法
![](https://img.haomeiwen.com/i2916190/16e0478fd66e9696.png)
然后在viewcontroller中就可以调用此方法,并将参数code传递到viewcontroller中,在viewcontroller中就可以利用code做需要做的事情,实现了事件和值的传递
![](https://img.haomeiwen.com/i2916190/0694d681e53e6863.png)
3.block可以作为方法的返回值
本文中将给Person类添加一个返回值为block类型的方法
![](https://img.haomeiwen.com/i2916190/589d5c41e0189ca4.png)
在viewcontroller中可以声明一个block去接收这个返回值,也可以直接使用这个返回值,并传递参数给这个block
![](https://img.haomeiwen.com/i2916190/af9730860b884923.png)
三、对block的相关总结
1.block可以用来进行事件或值的传递,是一种回调机制,是一种苹果推荐的类型,效率高。
2.使用block会引起循环引用,引起循环引用的根源是block和object的互相强引用、谁也释放不了谁,例如在使用ASI进行网络请求时,request强引用competionBlock,而在competionBlock中又使用了request,对request也进行了强引用,这样就会造成循环引用。
![](https://img.haomeiwen.com/i2916190/c1dc0cb47b0f884c.png)
解决循环引用的办法是使用弱引用打断retain cycle,使用__block修饰request
![](https://img.haomeiwen.com/i2916190/3179452314577304.png)
request被持有者释放后。request 的retainCount变成0,request被dealloc,request释放持有的Block,导致Block的retainCount变成0,也被销毁。这样这两个对象内存都被回收。
网友评论