博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block与函数指针有什么区别
阅读量:7255 次
发布时间:2019-06-29

本文共 1364 字,大约阅读时间需要 4 分钟。

block就是一个代码块,但是它的神奇之处在于在内联(inline)执行的时候(这和C++很像)还可以
传递参数。
同时
block本身也可以被作为参数在方法和函数间传递,
这就给予了block无限的可能。
 
 
block如何申明(对比于c语言中的函数申明)
[ 此帖被haoxue在2013-07-30 16:41重新编辑 ]
图片:block如何申明.png 
block <wbr>(三) <wbr>和函数指针有什么区别

第一个区别,函数指针是对一个函数地址的引用,这个函数在编译的时候就已经确定了。而block是一个函数对象,是在程序运行过程中产生的。在一个作用域中生成的block对象分配在栈(stack)上,和其他所有分配在栈上的对象一样,离开这个作用域,就不存在了。

Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。

 
Block实体形式如下:
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
例如下面的一个例子:
^(int a){return a*a;};  
这是代表Block会回传输入值的平方值(int a 就是参数列, return a*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里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
来源:http://blog.sina.com.cn/s/blog_7c8dc2d50101kwih.html

转载地址:http://lnkdm.baihongyu.com/

你可能感兴趣的文章
当一个有性能问题的数据库摆在你的面前,作为责任人,你的处理思路是什么?...
查看>>
Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)
查看>>
参观中央财经大学机房安装centos6.4及优化小结
查看>>
Windows Server 2012正式版RDS系列⑥
查看>>
Enabling Redo Log Transport Compression with active dataguard
查看>>
由文档那些事儿引发的思考 - 领导,您该反思了
查看>>
手握6亿把钥匙 能否打开“智能家居”的大门?
查看>>
从JS对象开始,谈一谈“不可变数据”和函数式编程
查看>>
STL标准容器类简介
查看>>
Linux下Oracle 10.2.0.1升级到10.2.0.4总结
查看>>
Revit二次开发示例:DeleteDimensions
查看>>
【英语】英语学习之道
查看>>
轻量级UIImageView分类缓存 库 AsyncImageView 使用
查看>>
ASP.NET MVC:Cookie 的过期时间在服务器端是获取不到的
查看>>
Debian中编译内核
查看>>
vs2013编译boost1.55.0 32/64位
查看>>
ASP.NET MVC应用程序展示RDLC报表
查看>>
jquery 导航栏目
查看>>
位操作:BitVector32结构 z
查看>>
初学java之菜单条,菜单,菜单项的设置
查看>>