block定义详解

来源:互联网 发布:抗皱护肤品知乎 编辑:程序博客网 时间:2024/05/29 05:00

block 是一组代码块组成的特殊类型,在定义和作为参数时跟普通类型略有不同,

// block :块代码.指向结构体的指针.javascript/js:闭包.

    // 闭包可以从函数外部访问函数内部的变量.

    

    // block 很灵活可以将 block 当做一个参数传递. ===> 将一个方法当做参数传递了.

    

    // block 使用:

    

    // 1. 定义block类型返回值/参数类型.

    // 2. 定义block中执行的内容确定block中执行的代码.

    // 3. 执行block.

    

    // 上面三步只要保证顺序就OK,具体哪一个步骤在哪一个对象中定义,不必关心.


block的定义:
void (^block)(int a,int b) =^(int a,int b){
NSLog(@"%d “,a+b);
};
void 是这个block返回值的类型,^这个符号专门代表block类型的,小括号内的(int a,int b)是参数列表,后面接的是定义后的直接赋值,^是固定写法,后面接上参数列表,再后面的大括号内写这个block具体包括的代码;
直接定义写法: 返回值类型 (^ block变量名)(参数列表);
block类型可以直接作为函数的参数或者函数的返回值:
一般比较常见的写法是typedef void (^block) ();
 这样通过起别名的方式把较为繁琐的block类型直接改为block,此时,定义一个变量名为bb的无参数无返回值的block类型就可以直接写:block bb; 其他有参数及有返回值的block均可以通过这种方式来起别名,这样起别名的好处是可以直接用于函数或是方法中传入block类型;

例如:
 typedef void(^ BlockType) ();
  @interface Person :NSObject
  @property    BlockType bb; 
  @prtoperty   int            a;
  @end
这里可以参照 下面的int型来做参考理解,
下面给新手讲解两个特别难理解的写法:

typedef void(^ BlockType) ();
  @interface Person :NSObject
 (1) -(void)test :(void (^)())  myblock;
  -(void)test :(void (^myblock)())  ;
  -(void) test:(BlockType) myblock;
(2):  @property  void(^block)();
  @prtoperty   int            a;
  @end
其中 (1) 是一种特殊的写法,把myblock作为参数传入对象的方法test中,下面两个传统写法作参考
其中(2)是一种常见的定义对象属性的方式,对比下面的int 类型定义还是有特别区别,新手可以这样理解,int a 是前面是类型,后面是变量名,也就是说@property需要知道后面的是什么类型,然后是变量名是什么,而我们用 @property  void(^block)();时,@property已经知道了这个是一个无参数无返回值类型的block,然后这个类型的变量名是block,所以这种写法是非常正统和正确的,当然也可以像上面的一样使用typedef起别名的方式来定义。

//下面就给出一个实例

A对象:需要执行一段代码,但是需要B对象的值

A对象要写的代码:(next为B对象,在A对象中能跟B对象进行交流的代码中写一句话,譬如在导航控制器的

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

方法)


next.block = ^(NextController * next){

    

        self.label.text = next.textField.text;

    };

//备注:如果在代码中的NextController * next不写齐的,系统无法去执行代码,

B对象要写的代码:

.h:

typedef void(^myblock)(NextController *);

@property(nonatomic,strong)myblock block;


.m

if (self.block) {

        self.block(self);

    }




0 0