12

/**

 *  1、如何定义一个Block变量

    2、怎样给定义的Block变量赋初值

    3、如何重定义Block类型

    4、如何使用Block实现具体的功能

    5、Block与变量作用域的关系

 */

 

int sum(int a, int b) {

    return a + b;

}

 

int count = 100;

 

int main(int argc, const char * argv[]) {

    

    /**

     *  1、Block是一种数据类型,并且是一种自定义的数据类型

        2、Block的标志是^(托字符)

        3、Block是匿名函数,TA与函数最主要的区别在于,函数在编译期就已经知道封装了什么功能,但是Block只有当执行时才知道内部封装的功能,所以说Block更加灵活多变

        4、Block的作用也是封装代码段来实现具体的功能

        5、既然Block是匿名函数,所以赋值时,不能将函数名直接赋值,初值为函数的实现体。

     */

    __block int a = 6;

    void (^testBlock)() = ^{

        NSLog(@"%d",a);//Block内部可以访问局部变量的值

        

        a = 9;//Block内部如果想修改外界局部变量的值,必须对变量进行__block修饰

        

        count = 101;//Block内部可以直接修改全局变量的值,也可以直接访问全局变量的值

    };

    testBlock();

    NSLog(@"a = %d, count = %d",a, count);

    

    

    

    

    

    

    

    

    

    int (*p)(int, int) = sum;

    typedef int (*P)(int, int);

    

    //myBlock是一个有参有返的匿名函数

    //myBlock是变量名

    //Block类型为 int (^)(int, int),表示此Block为 有一个整型返回值,两个整型参数的匿名函数

    //初值为:

//    ^(int a, int b) {

//        return a + b;

//    }

    

    //书写格式:

    /**

     *  1、初值中的返回值类型可以省略不写,但是必须保证,函数内部返回给外界的值的类型与返回值类型相同

        2、定义Block变量的类型中,参数名可以省略不写,但是初值中参数名不能不写,否则无法参与运算

        3、如果Block没有参数,那么在初值中表示参数的小括号可以省略不写

     */

    typedef int (^MyBlock)(int, int);

    

    int (^myBlock)(int, int) = ^(int a, int b) {

        return a + b;

    };//Block实现

    NSLog(@"result is %d",myBlock(10, 20));//Block执行

    

    MyBlock subBlock = ^(int a, int b){

        return a - b;

    };

    

    void (^helloBlock)() = ^ {

        NSLog(@"hello world");

    };

    helloBlock();

    

    NSInteger (^changeBlock)(NSString *) = ^(NSString *str) {

        return [str integerValue];

    };

    

    NSComparisonResult (^compareBlock)(NSString *, NSString *) = ^(NSString *str1, NSString *str2) {

        return [str1 compare:str2];

    };

 

posted @ 2016-02-23 09:13  whwhll  阅读(142)  评论(0编辑  收藏  举报