学了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)回调对比的更多相关文章

  1. C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子

    先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...

  2. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

  3. WPF如何获得变量异步回调函数时产生的异步回调

    有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...

  4. socket.io笔记二之事件监听回调函数接收一个客户端的回调函数

    //服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...

  5. Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!

    开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇 ...

  6. 【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包

    一,匿名方法定义 (参数1,参数2,....){ 方法体... return 返回值 } 二,匿名方法特性 可赋值给变量,通过变量进行调用 可在其他方法中直接调用或传递给其他方法 void main( ...

  7. JPush删除别名及回调函数(SWIFT)

    JPush(极光)删除别名传空字符串即可,官方回调函数的例子为OC的.用SWIFT其实也差不多. //用户登出后删除别名 APService.setAlias("", callba ...

  8. android回调函数

    在我们进行android开发的时候,常常遇到一些回调函数,当中,我们最常常使用的回调就是,当我们对一个组件设置监听的时候,事实上就相对于设置的回调函数.比如: Button btn = (Button ...

  9. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  10. JS学习:第二周——NO.1回调函数

    [回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...

随机推荐

  1. js中参数不对应问题

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  2. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  3. PHP数据类型之间的强制转换

    1.实型数据强制转换为整型数据 $float1=2.7; $int1=(int)$float1; echo var_dump($int1),"<br>"; 输出: in ...

  4. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  5. Aaron Stannard谈Akka.NET 1.1

    Akka.NET 1.1近日发布,带来新特性和性能提升.InfoQ采访了Akka.net维护者Aaron Stannard,了解更多有关Akka.Streams和Akka.Cluster的信息.Aar ...

  6. Go web开发初探

    2017年的第一篇博客,也是第一次写博客,写的不好,请各位见谅. 本人之前一直学习java.java web,最近开始学习Go语言,所以也想了解一下Go语言中web的开发方式以及运行机制. 在< ...

  7. 使用蓝灯后,IE浏览器以及内置IE浏览器的程序不能使用的解决方案

    使用完蓝灯后,每次使用IE浏览器都不能正常使用,于是有了下面的这个方案 1.通过Win+R 打开注册表编辑器(regedit) 进入目录 HKEY_CURRENT_USER \ Software \ ...

  8. [Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高

    运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAI ...

  9. [开发笔记]yum错误

    yum 错误TypeError: rpmdb open failed 解决办法 是因为RPM数据库出现损坏导致的,它导致所有的软件的升级.安装甚至是删除都会出现问题,终端出现乱码,YUMEX也用不成, ...

  10. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...