美文网首页
09-10、Block基本概念

09-10、Block基本概念

作者: 山中石头 | 来源:发表于2017-09-27 11:27 被阅读0次

    Block在OC中是一种数据类型,那么就可以定义变量,作为形参,作为返回值。
    复习C语言中指向函数的指针,对于Block学习大有帮助,因为他们很像。

    Snip20170927_77.png
    main.m
    #import <Foundation/Foundation.h>
    
    
    void printRose(int num)
    {
    for (int i = 0; i < num; ++i) {
        
        printf("  {@} \n");
        printf("   |  \n");
        printf("  \\|/ \n");
        printf("   | \n");
    }
    }
    
    int sum(int value1, int value2)
    {
    return value1 + value2;
    }
    int main(int argc, const char * argv[]) {
    /*
    第一个例子:没有返回值,也没有形参
    // void代表指向的函数没有返回值
    // ()代表指向的函数没有形参
    // (*roseP)代表roseP是一个指向函数的指针
    //    void (*roseP) ();
    //    roseP = printRose;
    //    roseP();
    
    // 定义一个block变量,
    // block和函数一样,可以没有返回值,也没有形参
    // 也可以没有返回值有形参
    // 也可以有返回值没有形参
    // 也可以有返回值有形参
    // 所以, 在定义一个block变量的时候, 也需要告诉该变量将来保存的代码有没有返回值和形参
    
    // void代表block将来保存的代码没有返回值
    // ()代表block将来保存的代码没有形参
    // (^roseBlock) 代表reseBlock是一个block变量, 可以用于保存一段block代码
    void (^roseBlock) ();
    // 如果block没有参数, 那么^后面的()可以省略
    roseBlock = ^(){
        printf("  {@} \n");
        printf("   |  \n");
        printf("  \\|/ \n");
        printf("   | \n");
    };
    // 要想执行block保存的代码, 必须调用block才会执行
    roseBlock();
    roseBlock();
     */
    /*
     第二个例子:没有返回值,有形参
    //    printRose(10);
    
    //    void (*roseP)(int);
    //    roseP = printRose;
    //    roseP(3);
    
    void (^roseBlock) (int);
    roseBlock = ^(int num){
        for (int i = 0; i < num; ++i) {
            
            printf("  {@} \n");
            printf("   |  \n");
            printf("  \\|/ \n");
            printf("   | \n");
        }
    
    };
    
    roseBlock(2);
     */
    
    /*
     第三个例子:有返回值,有形参
    //    int (*sumP)(int, int);
    //    sumP = sum;
    //    NSLog(@"sum = %i", sumP(10 , 20));
    
    int (^sumBlock) (int, int);
    sumBlock =^(int value1, int value2){
        return value1 + value2;
    };
    NSLog(@"sum = %i", sumBlock(10, 40));
     */
    
    //基本数据类型可以先定义再初始化,也可以定义的同时再初始化
    //    int a = 10;
    //    int b;
    //    b = 20;
    
    // 因为block是一种数据类型可以先定义再初始化,也可以定义的同时再初始化
    //    int (^printBlock)(int);
    //    printBlock = ^int (int num){
    //        for (int i=0; i<num; ++i) {
    //            printf("--------\n");
    //        }
    //        return 1;
    //    }
    
    
    int (^printBlock)(int)= ^int (int num){
        for (int i=0; i<num; ++i) {
            printf("--------\n");
        }
        return 1;
    }
    printBlock(2);
    
    
    return 0;
    }
    

    相关文章

      网友评论

          本文标题:09-10、Block基本概念

          本文链接:https://www.haomeiwen.com/subject/icoyextx.html