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

Posted leonlincq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式&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\\n",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\\n",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)、运行

以上是关于嵌入式&iOS:回调函数(C)与block(OC)回调对比的主要内容,如果未能解决你的问题,请参考以下文章

ios block和delegate的区别

iOS中-Block使用

[转]iOS代码块Block

看懂iOS代码块Block

嵌入式软件中回调函数同步与异步调用

这是我看过最全面讲解嵌入式C语言回调函数和函数指针的教程