前言

Objective-C中的块(block),类似于JavaScript中闭包,可以作为回调函数使用。这篇文章简单的记录了我在学习块的时候的一些自身的理解

正文

什么是闭包(Closure)

闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。
说的通俗一点,就是闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量。

我们用脚本语言来看一下:

function funA(callback){alert(callback());
}
function funB(){var str = "Hello World"; // 函数funB的局部变量,函数funA的非局部变量funA(function(){return str;});
}

通过上面的代码我们可以看出,按常规思维来说,变量str是函数funB的局部变量,作用域只在函数funB中,函数funA是无法访问到str的。但是上述代码示例中函数funA中的callback可以访问到str,这是为什么呢,因为闭包性。

ignore : javaScript的存在闭包是因为,function里面可以再次定义function,在第二个function里面访问第一个function的变量。而第二个function是可以在其他地方被调用的(可以返回这个function,也可以把它放到其它函数的参数列表里面当参数传递)

Objective-C中的闭包

Objective-C 里面也有闭包,它是Block。 Block类似于function方法(有自己的方法体,参数),block可以在 selector 如: -(returnType) methodName:(variableType) variableName 的方法体里面定义。Block里面可以使用Objective-C方法的局部变量。Block方法可以在其他地方使用(放到其它selector的参数列表里面,用到是回调这个块);

闭包例子

//.h
typedef BOOL (^blockType) (int);
-(blockType) blockUser;
//.m
/** 调用Block(闭包)*/
-(void)callBlockCode:(BOOL (^)(int)) bVariable {BOOL result = bVariable(1);if(!result) {NSLog(@"Hello Block");}}
/** 将Block类型在.h文件定义*/
-(blockType) blockUser {blockType blockVariable; //block原型声明,blockType在头文件typedel定义int flag = 0;blockVariable = ^ (int param) {//block定义if(flag * param) {return YES;}return NO;};[self callBlockCode:blockVariable];return blockVariable;
}//main
blockType bVariable = [test blockUser];
BOOL bv = bVariable(3);
NSLog(@"Block返回结果:%i",bv);

在main中特意返回一个Block并调用,没有任何问题,也说明了在main中也是可以访问闭包定义所在的上下文的变量,如这里的flag(在@Implementation里面)

块的语法

这里用先暂用一副图来描述它使用的语法

这里int (^myBlock) (int) 是一个块变量,在块变量中的参数列表可以只是一个类型

Objective-C基础之闭包相关推荐

  1. JavaScript基础系列---闭包及其应用

    闭包(closure)是JavaScript中一个"神秘"的概念,许多人都对它难以理解,我也一直处于似懂非懂的状态,前几天深入了解了一下执行环境以及作用域链,可戳查看详情,而闭包与 ...

  2. Swift基础之闭包

    内容纲要: 1.闭包基础 2.关于闭包循环引用 正文: 1.闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks) ...

  3. Objective - C基础: 第一天 - 1. 第1, 2个OC程序

    前言 前面我们已经讲完了C语言的基础,  终于进入到Objevtive - C啦, 这里我们简称为OC, OC是什么? 简单来讲, 它是一门基于C语言演变而来的一门面向对象的语言, 在C语言上添加了属 ...

  4. Objective C 基础教程

    复合 使用复合可组合多个对象,使之人工协作. 会同时使用继和复合来创建自己的类. 编程中的复合就好像音乐中的作曲一样:将多个组件组合在一起配合使用. 在Objective-C中,复合是通过包含作为实例 ...

  5. 2017/5 JavaScript基础9 --- 闭包、作用域

    2019独角兽企业重金招聘Python工程师标准>>> 一.理解闭包 1.闭包的例子 //一般函数 function outer(){var localVal = 30; //局部变 ...

  6. Python基础之闭包函数

    文章目录 闭包的概念 闭包实例 如何判断是否是闭包函数 闭包的概念 在 Python 中很多地方都会使用到闭包,那么究竟什么叫做闭包呢? 在维基百科上是这么解释的. 在一些语言中,在函数中可以(嵌套) ...

  7. JavaScript基础之闭包

    文章目录 一.闭包(closure) 从作用域链理解闭包 面试中的闭包 解决方法 一.闭包(closure) 来自红宝书: 闭包是指有权访问另外一个函数作用域中的变量的函数.关键在于下面两点: 是一个 ...

  8. Objective - C基础: 第一天 - 5.对象和类

    前面我们讲完了面向对象的思想, 那么现在我们来讲讲什么是对象, 什么是类. 比如: 一家工厂要生产一台轿车, 首先得有一台轿车的设计图, 然后根据这个设计图, 可以做出很多轿车, 然后轿车里面有一些不 ...

  9. Objective C基础教程——Xcode工程创建

    Objective-C只不过是拥有一些附加特性的C语言.本文将构建第一个Objective-C程序,同时介绍一些关键的附加特性. ##2.1 最简单的Objective-C程序 我们来写一个最简单的H ...

  10. python的闭包函数

    python的闭包 首先python闭包的作用,一个是自带作用域,另一个是延迟计算. 闭包是装饰器的基础. 闭包的基本形式: -------------------------- def 外部函数名( ...

最新文章

  1. 清华大学郑莉c++答疑
  2. Oracle数据库中的SOUNDEX函数
  3. 计算机桌面图标有箭头,电脑桌面图标为什么会有一个小箭头,原来没的呀,
  4. linux 运行python效率高还是windows高_为什么使用Mac开发比Windows效率高?
  5. mysql慢查询 表级锁_三分钟了解Mysql的表级锁——《深究Mysql锁》
  6. 软件工程实践_Task2_sudoku
  7. Numpy系列(六)常用的数组合并操作
  8. 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
  9. mysql ehcache_EhCache使用心得
  10. 多人共同在线文档协同编辑的技术实现
  11. excel锁定计算机,excel表格根据时间锁定如何操作
  12. linux打开pkg文件怎么打开,linux中怎么打开tar.rar.gz文件
  13. Auto Layout和UILabel
  14. 三维点云课程(七)——特征点描述
  15. 请领取你的免费云电脑:微软Windows实验虚拟机,每天可以免费使用两个小时,上Google搜资料很方便
  16. 遭遇裁员,如何渡过心理危机?
  17. Android Studio使用Mob获取手机验证码
  18. 使用python下载网易云课堂中Andrew Ng的机器学习课程
  19. (四)【Java精选面试题】AQS底层架构设计原理(含答案)
  20. 数据中心网络和计算存储方案

热门文章

  1. intel网卡驱动 linux,适用于英特尔® 千兆位以太网网络连接的 Linux* 基础驱动程序...
  2. SKU与SPU的区别与联系
  3. DSP eQEP正交编码
  4. Mujoco不错的视频教程
  5. figtree需要在JAVA下运行吗,科学网—Inno setup 制作安装文件以编译FigTree为例 - 张金龙的博文...
  6. 达摩达兰论估价pdf_应用公司理财PDF下载_(美)阿斯瓦斯・达摩达兰_机械工业出版社_会计_管理_零度图书网...
  7. 【国产MCU移植】看看有没有你需要的,一起来查漏补缺吧!(附已报名的硬件)...
  8. 乱码(四): 撬动地球的支点
  9. Linux之tar命令
  10. Java入门学习笔记——郝斌(三)线程