block和函数指针
来源:互联网 发布:app软件开发注意事项 编辑:程序博客网 时间:2024/05/17 22:46
block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以传递参数。同时block本身也可以被作为参数在方法和函数间传递,这就给予了block无限的可能。
block如何申明(对比于c语言中的函数申明)
第一个区别,函数指针是对一个函数地址的引用,这个函数在编译的时候就已经确定了。而block是一个函数对象,是在程序运行过程中产生的。在一个作用域中生成的block对象分配在栈(stack)上,和其他所有分配在栈上的对象一样,离开这个作用域,就不存在了。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。
Block实体形式如下:
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, intc),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成:^(void)。
例如下面的一个例子:
^(int a){return a*a;};
这是代表Block会回传输入值的平方值(int a 就是参数列, returna*a;就是行为主体)。记得行为主体里最后要加“;”,因为是叙述,而整个{}最后也要加“;”,因为Block是物件实体。
在ios开发中,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
Blocks的定义:
int (^myBlock) (int a,int b) = ^(int a,int b){
return a+b;
};
定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?
Blocks可以访问局部变量,但是不能修改。比如下面的代码就会报编译错
int num = 0;
//使用block
int(^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
如果要修改就要加关键字:__block(注意,是两个下划线"_")
__block int num = 0;
//使用block
int(^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, intc),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成:^(void)。
例如下面的一个例子:
^(int a){return a*a;};
这是代表Block会回传输入值的平方值(int a 就是参数列, returna*a;就是行为主体)。记得行为主体里最后要加“;”,因为是叙述,而整个{}最后也要加“;”,因为Block是物件实体。
在ios开发中,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
Blocks的定义:
定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?
Blocks可以访问局部变量,但是不能修改。比如下面的代码就会报编译错
int num = 0;
如果要修改就要加关键字:__block(注意,是两个下划线"_")
__block int num = 0;
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
0 0
- block和指针函数
- block和指针函数
- block和函数指针
- Block和函数指针的区别
- 函数指针和block的区别
- block和函数指针有什么区别
- typedef定义函数指针和block
- block和函数指针的理解
- block (三) 和函数指针有什么区别
- block (三) 和函数指针有什么区别
- C语言函数指针和Objective-c中的block
- 为了理解block 写的指针函数
- 17-block与指向函数的指针
- Objective-C block块与函数指针
- BLOCK与函数指针有什么区别
- block与函数指针的实例化
- 指针函数和函数指针
- 函数指针和指针函数
- 7 j2se 多线程间断(暂停后又继续)下载
- 安卓 总结:写在drawable文件夹中的 xml 图形资源文件
- C++ 从基类到派生类的转换
- 欢迎使用CSDN-markdown编辑器
- Objective-C基础-NSArray & NSMutableArray
- block和函数指针
- 详细设计说明书
- 《光荣与梦想》读书流水账—第一部
- 揭秘:传智播客报名如此火爆的内幕
- crc原理总结
- [转]ubuntu MySQL采用apt-get install安装目录
- ztree
- 和以往不同的周末
- android NDK开发编译C++文件出现Type 'jint' could not be resolved和Unresolved inclusion: <jni.h>的解决办法