基本就一句话,交代了Block在4.0后被引入,以及我们为什么要学习它的一个理由~
二:基本语法
Block可以看成一个语句块或者是很多时候当做匿名函数来使用。
animations参数接受一个block函数块。我们直接可以^{};来书写这个block。
然后看上面函数申明,我们看到animations接受的参数是这么申明的 (void(^)(void))animations;
这个也好理解,我们知道参数都需要一个申明一个类型比如
(NSTimeInterval)duration。(void(^)(void))其实就是block的一种常见格式的申明。里面还需要分为 :
第一个void是指的是block函数无返回,即{}执行玩没有返回值。(^)是固定规范,表明这是个block类型的。后面的()里表示block接受参数
当然,这边是(void)我们知道,不接受参数。
这边贴一张官方图
此图包含了申明和定义。
其实基本综合一下,我们要了解 三点
1.如何申明一个block函数
int(^testBlock)(int a,int b);
返回值类型 (^block名字)(传入参数)
2.OC申明一个带有block参数的函数
-(void)textF:(Bool (^)(id a,id b)) bBlock;
这个就如我们上面看到animations,基本和申明很类似,就是名称换到外面去了。
(返回类型 (^)(传入参数))block形参名
然后发现用C代码申明方法时:
void
dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t));
3.申明后实现一个block函数块
^(int a,int b){
//code;
}
block基本语法就如上。
在使用block时几个重要点:
1.block函数外的对象,在block语句块内只有可读访问权限。
2.对外部对象进行__block申明解决了问题1.
3 各类型的变数和block之间的互动:
5.对于block语句块内引用实例变量的计数器+1问题以及处理方法。这个也算是注意点,以及一些冷门面试题会出的问题。
6.因为受限制于sdk的问题,对于代码版本中使用新特性block后要对前面系统的支持,可能需要用
NS_BLOCKS_AVAILABLE来做判断和代码适配。
7.个人感觉,block做为代码或者是编程上一些进阶,可能因为习惯关系还是比较少用到它,甚至我问了一个朋友,居然说,没怎么听说过~
但是作为代理或是回调的另一种实现方式替代方式,也算是可以慢慢用之然后接受的。