嵌入式&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)回调对比的更多相关文章
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...
- JAVA回调函数ANDROID中典型的回调地方
在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...
- WPF如何获得变量异步回调函数时产生的异步回调
有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...
- socket.io笔记二之事件监听回调函数接收一个客户端的回调函数
//服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...
- Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!
开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇 ...
- 【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包
一,匿名方法定义 (参数1,参数2,....){ 方法体... return 返回值 } 二,匿名方法特性 可赋值给变量,通过变量进行调用 可在其他方法中直接调用或传递给其他方法 void main( ...
- JPush删除别名及回调函数(SWIFT)
JPush(极光)删除别名传空字符串即可,官方回调函数的例子为OC的.用SWIFT其实也差不多. //用户登出后删除别名 APService.setAlias("", callba ...
- android回调函数
在我们进行android开发的时候,常常遇到一些回调函数,当中,我们最常常使用的回调就是,当我们对一个组件设置监听的时候,事实上就相对于设置的回调函数.比如: Button btn = (Button ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- JS学习:第二周——NO.1回调函数
[回调函数] 定义:把一个函数的定义阶段,作为参数,传给另一个函数: 回调函数调用次数,取决于条件: 回调函数可以传参: 回调函数可以给变this指向,默认是window: 回调函数没有返回值,for ...
随机推荐
- 玩转spring boot——快速开始
开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- 关于全局ID,雪花(snowflake)算法的说明
上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.co ...
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- C#中如何给Excel添加水印
我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观.所以在这篇文章中,我将 ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知
一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...