oc61--block

Posted 672530440

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oc61--block相关的知识,希望对你有一定的参考价值。

//
//  main.m
//  Block基本使用:一种数据类型,应用在动画,多线程,集合遍历,网络请求回调。
//  用来保存一段代码,在恰当的时候拿出来调用。功能类似于函数。函数不能嵌套定义,block可以,
//  函数指针和block是一样的,相当于代码指针。

#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[]) {

    //printRose();
    // 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 (^roseBlock1) (int);
    roseBlock1 = ^(int num){
        for (int i = 0; i < num; ++i) {
            
            printf("  {@} \n");
            printf("   |  \n");
            printf("  \\|/ \n");
            printf("   | \n");
        }
    
    };
    roseBlock1(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));
    
    
    // block是一种数据类型
    
    int (^printBlock)(int)= ^int (int num){
        for (int i=0; i<num; ++i) {
            printf("--------\n");
        }
        return 1;
    };
    printBlock(2);
    
    
    
    
    int a = 10;
    int b;
    b = 20;
    return 0;
}
//
//  main.m
//  Block和typedef
//

#import <Foundation/Foundation.h>

int sum(int value1, int value2)
{
    return value1 + value2;
}

int minus(int value1, int value2)
{
    return value1 - value2;
}

typedef int (*calculte)(int, int);

// 注意: 利用typedef给block起别名, 和指向函数的指针一样, block变量的名称就是别名
typedef int (^calculteBlock)(int , int);


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

    
    int (*sumP)(int, int);
    sumP = sum;
    
    calculte sumP1 = sum;
    NSLog(@"sum = %i", sumP1(20, 10));
    
    
    int (*minusP)(int, int);
    minusP = minus;
    
    calculte minusP1 = minus;
    NSLog(@"minus = %i", minusP1(20, 10));
    
    
    int (^sumBlock)(int , int );
    
    calculteBlock sumBlock1 = ^(int value1, int value2){
        return value1 + value2;
    };
    NSLog(@"sum = %i", sumBlock1(20, 10));
    
    
    int (^minusBlock)(int , int);
    
    calculteBlock minusBlock1 = ^(int value1, int value2){
        return value1 - value2;
    };
    NSLog(@"minus = %i", minusBlock1(20, 10));
    
    return 0;
}

 

以上是关于oc61--block的主要内容,如果未能解决你的问题,请参考以下文章

oc引导怎么开机跑代码

oc渲染器提示着色器失败

UIWebView中Html中用JS调用OC方法及OC执行JS代码

缺少带有 ID 的必需视图,导航图 android

OC笔记一:Objective

在oc代码中使用swift第三方框架