虽然网上关于Block的例子很多很多啊,但是我还是要自己总结一下。

Block是什么

Block : 块
在IOS开发中,Block=代码块.
所有的代码,一段代码都可以称之为一个代码块,不仅仅是在IOS中.

Block有什么用

Block的用处有很多.
我基本都讲Block使用于回调,或者某个公共函数,但是需要执行不同的操作的时候.(例如延迟函数)
Block在IOS开发中有许多的好处,这个可以参阅Apple官方的API

Block的简单使用

Block的调用和声明

在IOS开发中Block的使用
我们使用「^」来声明一个Block对象,下面是一个Block的例子:

void (^myBlock)(void)=^{    NSLog(@"Hello World");};

这是一个很简单的Block的例子。
我们来分解一下几句代码的意思。

void /*表示这个block的返回值*/ (^myBlock)/*myBlock 是申明的这个block的名称*/ (void)/*这个void表示传递进去的参数*/=^{ /*这里是你要执行的代码*/ };  
有参数的Block的声明

通过上面这个简单的例子 我们就可以简单的写出一个有参数的的Block,
加入我要写一个 a+b的Block 并且输出

void (^aPlusbBlock)(int,int)=^(int a,int b){    NSLog(@"%d",a+b);};
Block中返回一个值

若是我们的Block需要一个返回值的时候,我们就需要像下面酱紫写

int sum=0;int (^aPlusbBlock)(int,int)=^(int a,int b){    return a+b;};sum=aPlusBlock(1,2);

通过这段代码 我们可以看出 调用一个Block的方法。

在Block中使用变量,以及改变一个变量的值

当我们使用Block以外的变量的时候我们有两种方式去使用

  1. 将这个变量传递到Block中去使用
  2. 直接使用Block外面声明的变量
    ←。 ← 其实我觉得我说了废话。

不过在改变值的时候就会有点不一样了。
传递到Block中的是形参当然是可以改变的,在Block外面的变量如果是想要在Block中操作需要加上 __block 去申明
下面来看一段示例代码:

__block int sum=0;void (^aPlusbBlock)(int,int)=^(int a,int b){    sum=a+b;};

若是在上面这段代码中 我不加 __block 去声明的话是无法操作 sum 变量的

Block的一些技巧、以及注意事项

使用typedef声明一个Block
typedef void      (^BoolBlock) (BOOL);   /*接受BOOL参数,没有返回值的block */typedef int       (^IntBlock)  (void);/*没有参数,返回int的block*/typedef BoolBlock (^OtherBlock) (IntBlock);/*从这个Block的定义可以看出,一个Block可以是参数,同时也可以是一个返回值*/
在某个方法中使用Block 作为参数

这里我们需要注意一下 Block参数的申明方式了

上面我们看到一个block的声明如下

void (^aPlusbBlock)(int,int)

但是在当作一个方法的参数使用的时候 我们必须如下书写方式

void (^) (int a, int b) aPlusbBlock

完整的写法就是酱紫

-(void) function:( void (^) (int a, int b) ) aPlusbBlock;  
若是你要在一个类里面定义一个Block的property,就需要像下面酱紫定义
@property (nonatomic, copy)BoolBlock block;//这里必须用Copy,这个理由嘛,暂时我也不清楚,可以自己查一下
static修饰的Block

大家知道static可以修饰一个静态变量,静态变量是可以全局调用的,当然Block也是可以的

static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;}; 

想酱紫,我们就可以定义一个静态的Block了

总结

总结写什么呢 其实没什么好总结的,好像ios开发中鼓励多使用Block以及GCD。文档好像有提到的样子。
Block的简单介绍和使用就到这里。