iOS指向函数的指针和block
一:block基础知识
block基础知识
基本概念:block是用来保存一段代码的;^:是block得标志 好比*:是指针的标志
特点:1:保存一段代码;
2:可以有参数和返回值;
3:可以作为函数的参数传递;
与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用;
二:普通数据类型、指向函数的指针、block的定义的类比
1:基本数据类型:
例如:int a = 10;
格式:数据类型 变量名 = 值;
2:指向函数的指针:可以仿照上边基本数据类型的定义
例如:void (*p)() = function; (funciton是某个定义好的函数)
格式:函数类型 *指针变量名 = 函数名;
说明:由于p指针是指向函数的,所以(*p)()中的红色小括号必须有,因为函数本身是要参数的,即使没有参数也要写();
如果p指向的函数有参数:int (*pp)(int, int) = sum;
调用指向函数的指针:
无参:p();
有参:int sum = pp(2,3);
3:block的定义和使用,和指向函数的指针格式很像
例如:void (^firstBlock)() = ^(){...代码...}; 说明:蓝色的小括号可以不写,有参数的时候必须写
格式:block类型 ^block名称 = ^{代码段};
有参数block:int (^multiBlock)(int, int) = ^(int a, int b){
return a * b;
};
调用block:无参:firstBlock()
有参:int result = multiBlock(2, 3);
// 备注:指向指针的函数和block,可以像基本数据类型一样可以分步定义 :
int (^multiBlock)(int, int); multiBlock = ^(int a, int b){
return a * b;
};
示例代码:
// 函数定义
int sum(int a, int b)
{
NSLog(@"a+b=%d", a + b);
return ;
} void logSome()
{
NSLog(@"我是void型的输出函数");
} int main()
{
/*** 1:基本数据类型的定义 ***/
int a = ;
// 1.1先定义 后赋值
int b;
b = ; /*** 2:指向了函数的指针 ***/ // 2.1:指向有参数的sum(int a, int b)函数
int (*p)(int, int) = sum;
// 2.2:指向无参数的函数logSome()函数
void (*logP)() = logSome; // 调用指向函数的指针函数
p(, );
logP(); /*** 3:block定义和使用 ***/ // 3.1:没有参数的block定义
void (^firstBlock)() = ^{ NSLog(@"注意:(^multiBlock)(),这里的小括号必须写,不管有没有参数"); NSLog(@"而后边的\" ^(){ \"的小括号可以不写");
}; // block的调用
firstBlock(); // 3.2 带参数和有返回值的block
int (^multiBlock)(int, int) = ^(int a, int b){
return a * b;
}; // 调用block
int result = multiBlock(, );
NSLog(@"%d", result); }
三:利用typedef 定义的block类型
利用typedef可以将繁琐的block定义简单化
例如:typedef void (^Myblock)(); 然后可以用Myblock类型 创建一个block,创建的格式像类创建对象
// 利用typedef定义block类型
typedef void (^Myblock)(); int main()
{
// 利用自定义的block类型创建一个block
Myblock myblock = ^{
NSLog(@"");
}; }
四:block和指向函数的指针作为函数参数
1:示例代码:
// block作为函数的参数
void test4(void(^mb)())
{
mb(); // 这里要手动调用参数block
} int main()
{ // 调用函数 同时给参数mb赋值一段代码
test4(^{
NSLog(@"block输出");
}); }
2:利用typedef可以将繁琐的block简单后,这个block就成为了一种类型,可以像类一样创建对象,指向函数的指针同样可以
// 利用typedef定义定义指向函数的指针
typedef void (*Tp)();
// 利用typedef定义block
typedef void (^Myblock)(); void logSome()
{
NSLog(@"我是void型的输出函数");
} // 指向函数的指针作为参数
void test1(Tp p)
{
p();
} // block作为函数的参数
void test2(Myblock mb)
{
mb();
} int main()
{
// 指向函数的指针定义
Tp myP = logSome;
test3(myP); // 定义block
Myblock mb = ^{
NSLog(@"block输出");
};
test4(mb);
}
iOS指向函数的指针和block的更多相关文章
- 指向函数的指针和block
原文网址: http://www.cnblogs.com/cxbblog/p/3841226.html 一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是bl ...
- 指向函数的指针与iOS-Block相关知识
指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- 【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
- C语言中 指向函数的指针 简介
引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...
- 12-返回指针的函数&&指向函数的指针
前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...
- 指向函数的指针数组(C++)
我们能够创建一个指向函数的指针数组.为了选择一个函数,只需要使用数组的下标,然后间接引用这个指针.这种方式支持表格式驱动码的概念:可以根据状态变量去选择被执行函数,而不用条件语句或case语句.这种设 ...
- 【学习笔记】【C语言】指向函数的指针
每个函数都有自己的内存地址,指针保存了函数的地址后就能指向函数了. #include <stdio.h> double haha(double d, char *s, int a) { } ...
- C++学习笔记:指向函数的指针
#include <stdio.h> int sum(int a, int b) { return a+b; } int minus(int a, int b) { return a-b; ...
随机推荐
- dojo中类的继承
类似于c# java等后台语言,在基于类的面向对象编程中,通常需要在子类中扩展某些父类的方法,这时可以在子类的方法中,先调用从父类继承的方法,然后再执行子类自定义的操作.凡是使用declare创建的类 ...
- jfinal excel表导出
在自己的WEB项目中要用到导出Excel,所以结合网络上的资源写了一个自己的export 工具类. 说明: JFinal 环境 WEB项目 JAVA后台生成非JS插件 好了,直接撸代码 1.设置文件保 ...
- [vijos1066]弱弱的战壕
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- java设计模式1--单例模式
1:单例模式简介 单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例.总而言之就是在系统中只会存在一个对象,其中的数据是共享的 特点: 单例类只能有一 ...
- IE支持直接查看Json数据注册表代码
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json] ...
- OpenFaceswap 入门教程(2):软件使用篇!
安装完OpenFaceswap之后,是不是就迫不及待的想要“见证奇迹”了呢? 都说磨刀不误砍柴工.开始之前请先做一个准备.然后大致了解一下换脸的过程 换脸基本步骤是: 把视频切成很多图片 把图片中的人 ...
- 基于django的个人博客网站建立(三)
基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...
- du 与df 统计系统磁盘不一致原因与解决方法
事件起因: 同事发现云主机磁盘系统盘满了,准备清理系统盘,便利用du 命令统计了根目录下各文件夹的大小,发现统计的各文件夹的大小总和 加起来比 df 命令查看到的系统盘所使用空间 要小很多.这里记录下 ...
- 动态规划:HDU1160-FatMouse's Speed(记录动态规划状态转移过程)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- poj 23565-Find a multiple
Find a multiple The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each ...