通过一个开红包按钮回传讲解一下简单block的用法
![](https://img.haomeiwen.com/i1444910/14512b93e42e18e6.jpeg)
要实现的功能是通过点击红包,弹出效果图的红包框,点击拆红包回调到控制器 去请求接口获取抢到的金额实现抢红包功能。
在RedPacketView.h中声明一个openPackets的block并实例化(可以传递参数)
![](https://img.haomeiwen.com/i1444910/ec508a1b8b77db9e.jpeg)
在拆红包按钮点击事件中,等待动画执行完毕触发block回调
![](https://img.haomeiwen.com/i1444910/001ba68efaa9c02b.jpeg)
回调之后在ViewController.m中进行后续逻辑处理
![](https://img.haomeiwen.com/i1444910/3d0550ce58c491c0.jpeg)
Block大致分为以下3种,_NSConcreteStackBlock,_NSConcreteMallocBlock,_NSConcreteGlobalBlock。_NSConcreteStackBlock为系统所控制,只用到外部局部变量、成员属性变量,且无强指针引用,返回时即销毁。_NSConcreteMallocBlock是为程序员所控制,有强指针引用,随着强指针引用销毁而销毁。_NSConcreteStackBlock没有用到外界变量或者只用到全局变量、静态变量,应用结束而销毁。
在block中捕获的外部变量分别为四种:全局变量,静态全局变量,静态变量以及自由变量捕获到的前三种都可以在block内部修改值,而自由变量则会报错。其原因是因为自由变量捕获到的只是其值 并没有内存地址。全局变量以及静态全局变量作用域为全局,所以随处都可修改,而捕获静态变量亦可捕获到其内存地址。而且 block只捕获在其内使用的自由变量,未使用的其他自由变量则不会捕获。
所以想要在block内部改变自由变量的值只能传递内存地址到block中或者通过__block改变其储存区方式
网友评论