微信号:rigongyizu365

介绍:一线码农不端不装的「日拱一卒」,关注技术、书籍、创业、GTD、以及一切个人成长周边的话题,每周一到五更新.

Objective-C中的块(block)语法初步

2015-07-01 17:15 lazybios

块(Block)作为Objc对C语言部分的一个扩展存在,其地位类似于Python的闭包,Js中的匿名函数。通过定义块语句,可以使得程序在函数执行和参数传递等环节更加灵活。

基本语法

定义

^ [返回值类型] (形参类型1 形参1, 形参类型2 形参2,…)
{
    //块执行体
};

上面块定义中,如果块中不含有参数,那么可以使用^(void)来代替占位。

通过上面形式定义的块,都是以匿名的形式存在的,如果想要多次调用,可以将块定义保存到变量中,这样在需要的时候可以,通过块变量来引用调取。

块变量的定义

[返回值类型] (^块变量名称)(形参类型1,...);

声明变量后,后面可以直接为该块变量进行赋值

块内操纵局部变量

块可以访问程序的局部变量,但是不可以修改局部变量,这是因为系统在定义块时,就已经把局部变量的值保存到了块的定义中了,而不是在运行时获取的。

当然,如果你确实有需要修改局部变量的使用场景时,可以在定义局部变量时用__block去修饰。其代表的含义是取值是在程序运行过程中进行的,而不是预先保存备份到块中。

typedef定义块变量类型

使用typedef对于块变量的重用可以带来巨大得便利。同时在作为参数传递中也能起到简化代码书写的功效,具体好处

复用块变量类型,使用块变量类型可以重复定义多个块变量
使用快变量类型定义函数参数,可以定义带块参数的函数

语法

typedef 块返回值类型 (^ 块变量类型名) (形参类型1 [形参名], …);

示例

typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
typedef int (^IntBlock)(void);//一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block


函数中使用块做参数

有了前面块变量的定义和使用基础,作为函数参数传递的块,其实就好理解了,可以将其想象成普通变量,只不过该变量指向的是一个匿名函数,此外还有一个与普通变量不同的地方就是:当块作为参数在函数中传递时,其参数位置往往被置于参数列表的最后一个

参考

http://t.cn/RLhMErK
疯狂iOS 讲义


 
日拱一卒 更多文章 使用Retry处理异常的套路 | Ruby 视图的使用 101 | MySQL 使用存储过程 | MySQL 触发器的使用 | MySQL 什么是康威定律 | 三分钟
猜您喜欢 程序员也是可以拍卖的 智能家居:是CES重头戏 但物联网通信才是关键 TDD 的本质不是 TDD 精神哥讲Crash(一):UnsatisfiedLinkError Java在现实生活中都用在哪些项目?