学了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. ASP.NET Core HTTP 管道中的那些事儿

    前言 马上2016年就要过去了,时间可是真快啊. 上次写完 Identity 系列之后,反响还不错,所以本来打算写一个 ASP.NET Core 中间件系列的,但是中间遇到了很多事情.首先是 NPOI ...

  2. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  3. 浅谈WEB页面提速(前端向)

    记得面试现在这份工作的时候,一位领导语重心长地谈道——当今的世界是互联网的世界,IT企业之间的竞争是很激烈的,如果一个网页的加载和显示速度,相比别人的站点页面有那么0.1秒的提升,那也是很大的一个成就 ...

  4. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  5. C++中的命名空间

    一,命名空间(namespace)的基本概念以及由来 1.什么是标识符: 在C++中,标识符可以是基本的变量,类,对象,结构体,函数,枚举,宏等. 2.什么是命名空间: 所谓的命名空间是指标识符的可见 ...

  6. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  7. java单向加密算法小结(1)--Base64算法

    从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...

  8. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  9. SQL SERVER导入数据到ORACLE的方法总结

    我们偶尔会有将数据从SQL SERVER导入到ORACLE当中的这种需求,那么这种跨数据库导数有那些方法呢?这些方法又有那些利弊呢? 下面比较肤浅的总结了一些可行的方法. 1:生成SQL脚本然后去OR ...

  10. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...