• 嵌入式&iOS:回调函数(C)与block(OC)回调对比


    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下。

    C的回调函数:

    callBack.h

    1)、定义一个回调函数的参数数量、类型。

    typedef void (*CallBack)(int data_i32);

    2)、声明一个外部函数指针。

    extern CallBack myCallBackPTR;
    

    3)、声明一个doSomeThingCount函数

    void DSTCount(void);
    

    callBack.c

    1)、定义一个函数指针

    CallBack myCallBackPTR;
    

    2、在doSomeThingCount函数,对运行次数自增,并调用函数指针

    void DSTCount(void)
    {
        static int numb = 0;
        numb++;
        (*myCallBackPTR)(numb);
    }
    

    main.c

    1)、定义一个customdoSomeThingCount函数,打印数据

    void customDSTCount(int data_i32)
    {
        printf("%d
    ",data_i32);
    }
    

    2)、main函数里,把callBack.h的函数指针指向main的 customDSTCount,运行 callBack.h 的 DSTCount 函数

    myCallBackPTR = customDSTCount;
        
    while (1)
    {
        DSTCount();
    }
    

    优点:1、不用修改callBack的文件,通过main或其他文件就可以对callBack文件进行修改、补充。

    用途:1、如,一个温度传感器外设.c,.h都写好了,不想别人修改它,设成只读,通过设置回调函数指针,根据需要设置滤波方式,或权值滤波、或平均值滤波。

    补充:1、回调函数在UCOS里,好像叫钩子(hooks)函数,是不是完全等同,后续再补充吧。

    OC的Block:

    MyButton.h(继承于UIButton):

    1)、定义一个Block的参数数量、类型。(基本相似,c是*,oc是^)

    typedef void(^ButtonBlock)(int data_i32);
    

    2)、声明、定义一个Block变量。(基本相似)

    @property (nonatomic,strong) ButtonBlock myButtonBlockPTR;
    

    3)、声明一个doSomeThingCount函数。(基本相似)

    -(void)DSTCount;
    

    MyButton.m(继承于UIButton):

    1)、在doSomeThingCount函数,对运行次数自增,并调用Block变量。(基本相似,C是(*xx)(yy),OC是xx(yy) )

    -(void)DSTCount
    {
        static int numb = 0;
        numb++;
        _myButtonBlockPTR(numb);
    }
    

    RootViewControl.m(self.window.rootViewController):

    1)、viewDidLoad函数,定义一个(100,100,100,100)、红色的按钮实例,按钮的Block里编写,打印次数,按钮添加事件,把按钮加到self.view上

    MyButton *tempButton = [[MyButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
        
    tempButton.backgroundColor = [UIColor redColor];
        
    tempButton.myButtonBlockPTR = ^(int data_i32){
        printf("%d
    ",data_i32);
    };
    
    [tempButton addTarget:self action:@selector(mybuttonClick:) forControlEvents:UIControlEventTouchUpInside];
        
    [self.view addSubview:tempButton];
    

    2、按钮点击调用,调用MyButton里的DSTCount函数

    -(void)mybuttonClick:(MyButton*)button
    {
        [button DSTCount];
    }
    

    对比:Block的实现,在设置变量时,在括号内编写,不是指向函数。

         C的回调函数,只是指针,得指向函数。

    补充:仅与C的回调函数对比,Block用处更广。

    图片补充:

    C回调函数:

    1)、CallBack.C

    2)、CallBack.h

    3)、main.c

    OC的Block

    1)、MyButton.h

    2)、MyButton.m

    3)、RootViewControl.m

    4)、运行

  • 相关阅读:
    【转】C#中的委托和事件
    ASP.NET上传文件实例代码
    我在配置OpenCV环境以及使用VS2013运行代码时遇到的问题
    JAVA_HOME环境变量失效的解决办法
    一道int和unsigned char之间强制类型转换的题目
    为什么不看好OpenStack:它的没落不可避免[转]
    一个销前谈云桌面的适用场景(再议云桌面营销之选择正确的客户环境)
    云桌面的前世今生
    云桌面三大谎言之GPU虚拟化
    如何理解清零心态
  • 原文地址:https://www.cnblogs.com/leonlincq/p/6227493.html
Copyright © 2020-2023  润新知