C语言函数指针 和 OC-Block

一、 C语言函数指针

关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037.html

#include <stdio.h>
//在main之前定义一个函数
int sum(int a, int b) {
return a + b;
} int main()
{
//定义函数指针变量pfunc,指向sum函数
int (*pfunc)(int a, int b) = sum;
// int (*pfunc)(int, int) = sum;
// int (*pfunc)() = sum;
// int (*pfunc)(int a,int b); pfunc = sum; // 利用指针变量p调用函数
int result = pfunc(, );
//int result = (*pfunc)(1, 3); 也可以 return ;
}

二、OC中block知识

1、什么是Blocks 

     Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block。 

2、在ios开发中,什么情况下使用Block

     Block可以作为类的属性,作为方法的参数,还可以在方法内部定义一个block局部变量,用来保存一段代码。简单来说,block就是一个特殊类型的变量(和变量int a一样),保存一段代码,然后在适当的时候运行,通常用来做并发任务、遍历、以及回调。 

3、直接声明、定义、调用block类型的变量

//
// ViewController.m
// #import "ViewController.h" @implementation ViewController
{
int(^sumBlock)(int x,int y); //声明int(^)(int,int)类型变量sumBlock,block是匿名的函数int (^)(int,int) 有名字的函数int sum(int,int)
} - (void)viewDidLoad {
[super viewDidLoad]; sumBlock = ^int(int x, int y){ //block赋值(定义)
return x+y;
};
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
if(sumBlock) sumBlock(,); //block调用
} @end

4. block的typedefine别名

typedef int(^IntBlock)(int,int);

//给int(^)(int,int)类型取了个别名叫IntBlock,  因为int(^)(int,int)是一种特殊的数据类型:Block,所以typedef语句之后,IntBlock就是一种数据类型,和int/float/double一样。这样使用起来就非常方便。

5.block作为类的属性

//在创建完block的时候需要调用copy的方法。copy会把block从栈上移动到堆上。

@property (copy,nonatomic) int(^sumBlock)(int,int);  //定义了一个int(^)(int,int)类型的属性sumBlock

@property (copy,nonatomic) IntBlock intBlock;           //定义了一个int(^)(int,int)类型的属性intBlock

6.block作为方法参数(形参)的写法

- (void)testBlock:(void (^) ()) aBlock;

- (void)printResult:( int (^) (int, int) )sumBlock;  //此处( int(^)(int, int) )是sumBlock的类型

可见当block作为函数参数时,只是将block类型用()括起来,然后将block名字写在block类型后面而已。

调用方法时,给block类型的形参赋值:

[self printResult:^int(int x, int y) {

return x+y;

}];

[WZCategory  mj_setupReplacedKeyFromPropertyName:^NSDictionary *{

return @{@"ID":@"id"};

}];

7、__block  关键字 

     一个Block内部时可以使用自身作用域外的静态变量(static变量),全局变量(extern变量),__block修饰的自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。 如果想要在block中使用auto变量,需要在自由变量之前加上__block关键字修饰。

三、C语言函数指针 和 OC-Block 对比

1.声明和调用写法对比

int (*CFunc) (int a);        指向函数的指针
 int result = CFunc(10); 
 int (^BFunc)  (int  a);     保存一段代码的block, block是匿名的函数int (^)(int,int)  有名字的函数int sum(int,int)
 int result = BFunc(10);

2. block和函数指针都可以看成是一种数据类型,就像int、float、NSString一样。

3. iOS中将用block定义好的变量看作是一个对象,block对象在作为属性时使用copy关键字。

指向函数的指针与iOS-Block相关知识的更多相关文章

  1. iOS指向函数的指针和block

      一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作 ...

  2. 指向函数的指针和block

    原文网址: http://www.cnblogs.com/cxbblog/p/3841226.html 一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是bl ...

  3. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  4. 【C语言】-返回指针的函数与指向函数的指针

    本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...

  5. C语言中 指向函数的指针 简介

    引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...

  6. 12-返回指针的函数&&指向函数的指针

    前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针   一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...

  7. 指向函数的指针数组(C++)

    我们能够创建一个指向函数的指针数组.为了选择一个函数,只需要使用数组的下标,然后间接引用这个指针.这种方式支持表格式驱动码的概念:可以根据状态变量去选择被执行函数,而不用条件语句或case语句.这种设 ...

  8. 【学习笔记】【C语言】指向函数的指针

    每个函数都有自己的内存地址,指针保存了函数的地址后就能指向函数了. #include <stdio.h> double haha(double d, char *s, int a) { } ...

  9. C++学习笔记:指向函数的指针

    #include <stdio.h> int sum(int a, int b) { return a+b; } int minus(int a, int b) { return a-b; ...

随机推荐

  1. java ---运算符

    运算符简单来划分可以分为五大类:分别是算术运算符.关系运算符.逻辑运算符.三元运算符和赋值运算符.下面来分别介绍一下这几类运算符: 一.算术运算符 包含+  -  *  /  %  ++  --,这几 ...

  2. 【液晶模块系列基础视频】4.3.X-GUI图形界面库-画box函数简介

    [液晶模块系列基础视频]4.3.X-GUI图形界面库-画box函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...

  3. 每天学点GDB14

    在上一篇文章中讲到了ptrace,那么我们完全可以用ptrace来写一个非常简单的trace工具,用以trace程序的具体运行过程. 用它可以很清楚的回答,使用glibc编译后的hello world ...

  4. MySQL 数据库设计 笔记与总结(2)逻辑设计

    [实例演示 —— 实体之间的关系] [逻辑设计的工作] ① 将需求转化为数据库的逻辑模型 ② 通过 ER 图的形式对逻辑模型进行展示 ③ 同所选用的具体的 DBMS 系统无关 [名词解释] 候选码可以 ...

  5. Redis安装及初步使用

    一.Centos下安装Redis1.wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm2.rp ...

  6. 让Storm插上CEP的翅膀 - Siddhi调研和集成

    什么是 Siddhi? Siddhi 是一种 lightweight, easy-to-use, open source CEP(Complex Event Processing)引擎,由wso2公司 ...

  7. Python For Data Analysis -- Pandas

    首先pandas的作者就是这本书的作者 对于Numpy,我们处理的对象是矩阵 pandas是基于numpy进行封装的,pandas的处理对象是二维表(tabular, spreadsheet-like ...

  8. html轮播效果的实现

    要实现如下图的效果 点击可以选择图片:不点击的时候自动轮播:并且点击完后再次自动轮播. 思路:如同在房子里透过窗子看路过的火车一样,窗子是不动的,但火车是陆续经过窗子的,所以透过窗子可以看到依次看完所 ...

  9. UI auto test

    java.home/lib/security/java.policy (Solaris/Linux) http://www.cnblogs.com/richaaaard/p/5091059.html ...

  10. 【Android测试】【第五节】LogCat——命令行

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4684123.html 前言 上一篇将的是如果在eclips ...