Block是什么(基础篇)
用而了解之(浅说)
- 苹果怎么说
- 块对象是C层面的语法和运行时特性,它允许您编写函数表达式,这些函数表达式可以作为参数传递、可选地存储并由多个线程使用。函数表达式可以引用并可以保存对局部变量的访问。在其他语言和环境中,块对象有时也被称为闭包或lambda表达式。当您想要创建可以像值一样传递的工作单元(代码段)时,可以使用块。块提供更灵活的编程和更多的功率。例如,您可以使用它们来编写回调或对集合中的所有项执行操作。
- 简而言之(借用其他大咖的总结)
- block是一个可以在C,C++,以及OC中可以使用的语法闭包,带参数的匿名函数,是一个C语言层面的特性。
- 笔者愚见
- 就是个fuc(-方法)的浓缩.
- 优点:反向传值可以不用写很多-(void)之类的方法(函数)。
- 缺点:不给block写注释或者说明,我保证你三个小时后不知道这个代码块是干嘛的:)而且很难追踪函数的指针。
^{
//此处应该有执行代码
NSlog(@"代码块中的代码");
}
- 定义block
BOOL ^(exampleBlock)(BOOL isExample) = ^(BOOL isExample){
//这里写代码
NSLog(@"我是一个匿名Block,我赋值给了exampleBlock对象");
return YES; //返回值
}
- return_type (^block_name)(params....),这就是Block的基础定义结构,请结合上面栗子来看.
- return_type 指block的返回,这里指的是BOOL布尔返回。
- (^block_name) 指block的名字,这里的name 是exampleBlock
- (params...)指传递的参数,一般格式可以用(变量类型 变量名,变量类型 变量名...),变量名也可以不加.PS(如果没有变量传递怎么写呢? 可以直接这样写(void)或者直接(),直接()编译器会warning,但是可以跑起来~)。
- 等号后面就是直接对我们定义的exampleBlock的实现,正如我在NSLog中所打印的一样,对block的对象实现就是给他赋值(可以这么理解吧,block可以当对象来处理)一个同入参同返回(不需要同名)的block,这里我们直接用的是匿名Block(别急,马上要讲,看了下面,再来理解这句话也不迟)实现。
- 匿名Block:指没有名字的block~ 玩笑,take it easy. 但是我们确实可以这么理解。因为我们的block,有时候会这么用,exp:
-(void)getReturnValueByBlock:(BOOL(^)(BOOL isCool))block{
if (/*条件语句*/)
{
block(YES);
}
}
- 上面的用法,只是通常匿名block的多种用法的一种。其实可以在自带NSArray的枚举方法中找到这种用法,向方法中传递一个匿名函数参数(马上也要讲,别急),甭管调用的方法内部怎么跑的,有时候,我们只需要实现block代码块里的代码就可以了(也就是将方法内部的部分算法实现,让方法的调用者去实现,有点像采用了模板方法设计模式)。
- 这里我们就可以理解了为什么叫匿名block。(
因为这个block没名字呀:))
- 以上简单的一些介绍了Block。而在网络请求三方库AFNet中,我们会经常使用这种方式获取网络请求结果。下一篇,会讲一讲block为啥可以当一个参数,block本质是啥。 如笔者愚见不符您的看法,请轻喷。