热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【ios学习】之七、Blocks简介

blocksblocks是c语言的扩充,他是:带有自动变量(局部变量)的匿名函数。这个概念叫做:闭包。如python中的lambda,在c++11中也引入了lambda;

blocks

blocks是c语言的扩充,他是:带有自动变量(局部变量)的匿名函数。
这个概念叫做:闭包。如python中的lambda,在c++11中也引入了lambda;

维基百科中关于闭包:闭包Closure)是词法闭包Lexical
Closure
)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

blocks的语法:

^ 返回值类型  参数列表  表达式

^ 参数列表  表达式

^ 表达式



^void (int i){ printf("%d", i);}

^(int i){printf("%d", i);}

^{printf("123");}



这里要注意,当你省略返回值类型的时候,你的表达式里return返回什么类型,那么你的返回值类型就是什么。

当你不适用参数的时候,(void) 参数列表可以省略。



在使用block的时候,我们可以声明block变量,他同c中的函数指针:

int f(int a) {
return a;
}
int (*fa)(int) = &f;


在blocks中,block指源代码中的block语法,也指由block语法生成的值。

int (^blk)(int);
int (^blk)(int) = ^(int a){ printf("%d, a); }
int (^blk1)(int) = blk;
int (^blk2)(int);
blk2 = blk1;




void f(int (^blk)(int));   //向函数传递block

int (^f()(int));    //将block作为返回值返回。



可以使用typedef:

typedef int (^blk_t)(int);
void f(int (^blk)(int)) 对应: void f(blk_t blk)
int (^f()(int)) 对应: blk_t f();




比较函数指针:

int (*ff(int))(int *, int);

这个有点难理解了,我们要从里往外看:

ff(int)   这里将ff声明为一个函数,它有一个int的形参。  

这个函数的返回值就是int (*)(int *, int);

这是一个指向函数的指针。我们来变一下形式:




[cpp] view
plaincopy




  1. typedef int (*func)(int*, int);   

  2. func ff(int)
     





这里可以看到,他们只有一个* 和一个 ^ 的区别。

他可以作为:自动变量,函数参数,静态变量,静态全局变量,全局变量使用。

block类型变量可以和c语言中其他类型变量一样使用。

如: 

typedef int (^blk_t)(int);
blk_t blk = ^(int count){return count;};
blk_t *blkptr = &blk;
(*blkptr)(10);




自动变量

来说一下自动变量:

block表达式截获所使用的自动变量的值:保存该自动变量的瞬间值。

代码解释:

int val = 0;
void (^blk)(void) = ^{printf("%d", val);};
val = 3;
blk();




此时,输出的是0而不是3.



__block



自动变量值截获只能保存执行block语法瞬间的值,保存后不能改写了。 当你在block改写截获的自动变量时,会产生编译错误。

如果想要在block语法的表达式中将值付给block语法外声明的自动变量,那么需要在这个自动变量上附加__weak说明符:

__block int a = 0;

void (^blk)(void) = ^{a = 1;};

blk();



获取的自动变量

id array = [[NSMutableArray alloc]init];
void (^blk)(void) = ^{id obj = [[NSObject alloc]init];
[array addObject:obj];};
id array = [[NSMutableArray alloc]init];
void (^blk)(void) = ^{array = [[NSMutableArray alloc]init];};




上面两段代码第二段会出现错误,应该加上__block说明符。 因为向截获的变量array赋值会产生编译错误。但是使用截获的值是不会产生任何问题的。



const char text[] = "hello";

void (^blk)(void) = ^{printf("%c", text[2]);};



const char *text = "hello";

void (^blk)(void) = ^{printf("%c", text[2]);};

上面两段代码会出现不同的结果,第一段会报错,因为截获自动变量的方法没有实现对c数组的截获。





-----2014/3/18  Beijing

【ios学习】之七、Blocks简介,布布扣,bubuko.com


推荐阅读
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细解析了如何使用Python语言在STM32硬件平台上实现高效的编程和快速的应用开发。通过具体的代码示例,展示了Python简洁而强大的特性。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
author-avatar
LD系瑰精棂_142
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有