Block的理解和使用

bolck的功能:

和通知、代理类似, 通俗的讲就是为了完成即将完成的事情. 还有就是, 定义的block内部的代码只有在block被调用的时候才会执行, 在下边的具体中会介绍.

一、语法:

1)block作为本地变量(local variable)  

    returnType (^blockName)(parameterTypes) = ^returnType(parameters){...};  

2)block作为类的成员属性(@property)  

    @property (nonatomic, copy) returnType (^blockName)(parameters);  

    这时候可以类比delegate,实现代理功能。  

3)block作为函数参数(method parameter)  

    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;  

    调用包括block参数的函数,  

    [someObject somethodThatTakesABlock:^returnType(parameters){...}];  

4)使用typedef定义block类型  

    typedef returnType (^TypeName)(parameterTypes);  

    TypeName blockName = ^returnType(parameters){...}; 

二、举例:

(1)block作为本地变量

- (void)viewDidLoad {

    [super viewDidLoad];

 

    void (^printNum)() = ^(){

        NSLog(@"no num"); // 后执行

    };

    printNum(); // 先调用

    

    void (^printNum1)(int,int) = ^(int a, int b) {

        NSLog(@"%d",a*b); // 后执行

    };

    printNum1(1,9); // 先调用

 

  int c = 0;

  _ _block int d = 0;

    void (^printNum2)(int,int) = ^(int a, int b) {

    c = a +  b; // 编译报错

    d = a + b;

        NSLog(@"%d",c);

    NSLog(@"%d",d);

    };

    printNum2(1,9); // block内部修改外部变量的时候, 需要在外部变量前边加上 _ _block

// 3个 printNum 的打印都是在调用之后再执行bolck内部的代码

}

2)block作为类的成员属性

3)block作为函数参数

4)使用typedef定义block类型

posted @ 2016-11-09 10:50  仙草丶  阅读(197)  评论(0)    收藏  举报