Objective-C基础之闭包
前言
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基础之闭包相关推荐
- JavaScript基础系列---闭包及其应用
闭包(closure)是JavaScript中一个"神秘"的概念,许多人都对它难以理解,我也一直处于似懂非懂的状态,前几天深入了解了一下执行环境以及作用域链,可戳查看详情,而闭包与 ...
- Swift基础之闭包
内容纲要: 1.闭包基础 2.关于闭包循环引用 正文: 1.闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks) ...
- Objective - C基础: 第一天 - 1. 第1, 2个OC程序
前言 前面我们已经讲完了C语言的基础, 终于进入到Objevtive - C啦, 这里我们简称为OC, OC是什么? 简单来讲, 它是一门基于C语言演变而来的一门面向对象的语言, 在C语言上添加了属 ...
- Objective C 基础教程
复合 使用复合可组合多个对象,使之人工协作. 会同时使用继和复合来创建自己的类. 编程中的复合就好像音乐中的作曲一样:将多个组件组合在一起配合使用. 在Objective-C中,复合是通过包含作为实例 ...
- 2017/5 JavaScript基础9 --- 闭包、作用域
2019独角兽企业重金招聘Python工程师标准>>> 一.理解闭包 1.闭包的例子 //一般函数 function outer(){var localVal = 30; //局部变 ...
- Python基础之闭包函数
文章目录 闭包的概念 闭包实例 如何判断是否是闭包函数 闭包的概念 在 Python 中很多地方都会使用到闭包,那么究竟什么叫做闭包呢? 在维基百科上是这么解释的. 在一些语言中,在函数中可以(嵌套) ...
- JavaScript基础之闭包
文章目录 一.闭包(closure) 从作用域链理解闭包 面试中的闭包 解决方法 一.闭包(closure) 来自红宝书: 闭包是指有权访问另外一个函数作用域中的变量的函数.关键在于下面两点: 是一个 ...
- Objective - C基础: 第一天 - 5.对象和类
前面我们讲完了面向对象的思想, 那么现在我们来讲讲什么是对象, 什么是类. 比如: 一家工厂要生产一台轿车, 首先得有一台轿车的设计图, 然后根据这个设计图, 可以做出很多轿车, 然后轿车里面有一些不 ...
- Objective C基础教程——Xcode工程创建
Objective-C只不过是拥有一些附加特性的C语言.本文将构建第一个Objective-C程序,同时介绍一些关键的附加特性. ##2.1 最简单的Objective-C程序 我们来写一个最简单的H ...
- python的闭包函数
python的闭包 首先python闭包的作用,一个是自带作用域,另一个是延迟计算. 闭包是装饰器的基础. 闭包的基本形式: -------------------------- def 外部函数名( ...
最新文章
- 清华大学郑莉c++答疑
- Oracle数据库中的SOUNDEX函数
- 计算机桌面图标有箭头,电脑桌面图标为什么会有一个小箭头,原来没的呀,
- linux 运行python效率高还是windows高_为什么使用Mac开发比Windows效率高?
- mysql慢查询 表级锁_三分钟了解Mysql的表级锁——《深究Mysql锁》
- 软件工程实践_Task2_sudoku
- Numpy系列(六)常用的数组合并操作
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- mysql ehcache_EhCache使用心得
- 多人共同在线文档协同编辑的技术实现
- excel锁定计算机,excel表格根据时间锁定如何操作
- linux打开pkg文件怎么打开,linux中怎么打开tar.rar.gz文件
- Auto Layout和UILabel
- 三维点云课程(七)——特征点描述
- 请领取你的免费云电脑:微软Windows实验虚拟机,每天可以免费使用两个小时,上Google搜资料很方便
- 遭遇裁员,如何渡过心理危机?
- Android Studio使用Mob获取手机验证码
- 使用python下载网易云课堂中Andrew Ng的机器学习课程
- (四)【Java精选面试题】AQS底层架构设计原理(含答案)
- 数据中心网络和计算存储方案
热门文章
- intel网卡驱动 linux,适用于英特尔® 千兆位以太网网络连接的 Linux* 基础驱动程序...
- SKU与SPU的区别与联系
- DSP eQEP正交编码
- Mujoco不错的视频教程
- figtree需要在JAVA下运行吗,科学网—Inno setup 制作安装文件以编译FigTree为例 - 张金龙的博文...
- 达摩达兰论估价pdf_应用公司理财PDF下载_(美)阿斯瓦斯・达摩达兰_机械工业出版社_会计_管理_零度图书网...
- 【国产MCU移植】看看有没有你需要的,一起来查漏补缺吧!(附已报名的硬件)...
- 乱码(四): 撬动地球的支点
- Linux之tar命令
- Java入门学习笔记——郝斌(三)线程