Block :block 实际上就是 Objective-C语言对闭包的实现

闭包(Closure):闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量。

 

1 block 的原型 和 定义

  *block的 原型:

int  ( ^ sumblock ) ( int , int );

上面的代码声明了一个block(^)的原型,名字叫做 sumblock,包含两个 int 型的参数,返回值为 int类型

 

  *block的定义:

sumblock  =  ^ ( int parmaA, int parmaB ) {

 

  return 10;

};

 

上面的代码中,将一个函数体赋值给了 sumblock 变量,其接收一个名为 paramA 和一个名为 paramA的参数,返回一个 int 对象

注意:一定不要忘记 block 后面的分号

 

 

  *block 的使用

定义好 block 后,就可以像使用标准函数一样使用它了:

sumblock(7,7);

 

 

2 block  的重定义

  由于 block 数据类型的语法会降低整个代码的阅读性,所以常使用 typedef 来定义 block 类型。

  typedef int ( ^ sumblock ) ( int , int );

定义之后 sumblock 就是一个类 ,如 int,NSString;

说明 : 本来一般重定义是  typedef int ( ^ ) ( int , int ) sumblock; 但是 block 比较特殊,应该将新 block 变量名写在托字符 ^ 后面

 

3 block 内部可以访问外部变量

  默认情况下, block 内部不能修改外面的局部变量

  给局部变量加上 __block 关键字,这个局部变量就可以在 block 内部修改

 

4 block 传值 一般是从后(backVC)往前(foreVC)传

 

  *block 作为属性传值

a 传值第一步 : 声明 block 属性     (backVC)

重定义

typedef void ( ^ MyBlock ) ( NSString * paramA);  参数名可写不写

声明属性

@propertry ( copy , nonatomic ) MyBlock myBlock;

 

 

b 传值第二步 : 调用 block 函数,将传递的内容通过 block 的参数传递    (backVC)

backVC.myBlock (传递的内容作为参数传递)

 

c 传值第三步 :定义 myBlock , 在 block 函数体中赋值,当第二步调用时,执行函数体中的赋值操作    (foreVC)

backVC.myBlock = ^ ( NSString * paramA){

   赋值操作

}

 

 

  *block 作为参数传值

a 传值第一步 定义方法, 用 block 为其一参数 backVC

重定义

typedef void ( ^ MyBlock ) ( NSString * paramA);  参数名可写不写

 

声明方法

- ( void )blockWithMyBlock: ( MyBlock ) myBlock;

b 第二步 实现方法,调用 Block 函数   backVC

- ( void )blockWithMyBlock:( MyBlock ) myBlock{

  __weak typeof(self) weakSelf = self;// 防止循环引用

  myBock ( paramA );

}

 

c 传值第三步 foreVC

[ backVC blockWithMyBlock : ( MyBlock ) myblock =

 

^ void ( NSString * paramA ){

  值已经传过来了,当第二步调用 block 的时候,可以在这里使用 paramA

 

}];