obj-c编程09:块的语法
来源:互联网 发布:淘宝女装最常见的模特 编辑:程序博客网 时间:2024/04/29 20:19
在obj-c中,有一种和C截然不同的东西——块。块可以在外边定义,也可以在函数或方法内部定义,可以被赋值给一个变量,然后用该变量调用。默认情况下块对外部变量的访问只能读不能写,除非用__block显示声明可写。对于块这么个东东,让我想到了ruby中的block,不过ruby中block是闭包,而且外部变量变化会影响block的值,但obj-c的块不会,即obj-c块的外部变量是编译时求值而不是运行时求值哦:
#import <Foundation/Foundation.h>int main(int argc,char *argv[]){@autoreleasepool{int i = 10;//foo是一个块变量被赋值为一个块。int (^foo)(int) = ^(int x) {int ret = x * i;//i = 100;编译错误,不能改写外部变量的值NSLog(@"%d * i(%d) = %d",x,i,ret);return ret;};i = 1000;foo(11);//i此时为10而不是1000哦。}return 0;}
可以看到在块内是不能写外部i变量的,除非用__block修饰:
#import <Foundation/Foundation.h>int main(int argc,char *argv[]){@autoreleasepool{__block int i = 10;//foo是一个块变量被赋值为一个块。int (^foo)(int) = ^(int x) {i = 100;int ret = x * i;NSLog(@"%d * i(%d) = %d",x,i,ret);return ret;};i = 1000;NSLog(@"ret is %d",foo(11));//i此时为100哦。}return 0;}
如果是在ruby中则外部变量变化会导致block的结果发生变化,也给个例子吧:
apple@kissAir: objc_src$irb2.1.1 :001 > $v = 100 => 100 2.1.1 :002 > b = ->(x){puts "#$v * #{x} = #{$v * x}"} => #<Proc:0x0000010182c0d8@(irb):2 (lambda)> 2.1.1 :003 > b[11]100 * 11 = 1100 => nil 2.1.1 :004 > $v=11 => 11 2.1.1 :005 > b[11]11 * 11 = 121 => nil
[2014.07.06第一次新增内容]:块功能扩展
我们还可以用block来实现集合对象的map功能,比如ruby中数组或散列的map:
#import <Foundation/Foundation.h>#define msg(...) NSLog(__VA_ARGS__)NSArray *map(NSArray *ary,id (^block)(id)){NSMutableArray *ary_ret = [NSMutableArray array];for(id x in ary)[ary_ret addObject:block(x)];return ary_ret;}int main(int argc,char *argv[]){@autoreleasepool{NSArray *ary_init = [NSArray arrayWithObjects:@"big",@"small",\@"love",@"pluck",@"save",nil];NSArray *ary = map(ary_init,^(id item){\return [item capitalizedString];});msg(@"%@",ary);}return 0;}
运行结果如下:
apple@kissAir: objc_src$./blk
2014-07-06 14:47:57.758 blk[1009:507] (
Big,
Small,
Love,
Pluck,
Save
)
块能做的事可不止这些哦,我们可以借助GCD中对块的支持并发的执行任务:
#import <Foundation/Foundation.h>#define msg(...) NSLog(__VA_ARGS__)int main(int argc,char *argv[]){@autoreleasepool{NSMutableArray *ary_m = [NSMutableArray array];//获取GCD全局队列dispatch_queue_t g_queue = dispatch_get_global_queue(0,0);//创建新的执行组dispatch_group_t grp = dispatch_group_create();srand(time(NULL));__block int s = 0;for(int i = 0;i < 1000;++i){dispatch_block_t block = ^{s = rand() % 5;sleep(s);msg(@"at %4d:sleeped %d s",i,s);};//在组中异步执行块dispatch_group_async(grp,g_queue,block);}//等待组中所有块任务执行完毕dispatch_group_wait(grp,DISPATCH_TIME_FOREVER);}return 0;}
运行如下:
apple@kissAir: objc_src$./blk
2014-07-06 15:25:07.318 blk[1231:3903] at 19:sleeped 0 s
2014-07-06 15:25:07.318 blk[1231:3303] at 17:sleeped 0 s
2014-07-06 15:25:07.319 blk[1231:4703] at 21:sleeped 0 s
2014-07-06 15:25:07.319 blk[1231:4c03] at 22:sleeped 0 s
2014-07-06 15:25:07.319 blk[1231:4003] at 20:sleeped 0 s
2014-07-06 15:25:07.322 blk[1231:3e03] at 31:sleeped 0 s
2014-07-06 15:25:07.323 blk[1231:5e03] at 36:sleeped 0 s
2014-07-06 15:25:07.324 blk[1231:6403] at 40:sleeped 0 s
2014-07-06 15:25:07.325 blk[1231:6803] at 43:sleeped 0 s
2014-07-06 15:25:07.327 blk[1231:7a03] at 53:sleeped 0 s
2014-07-06 15:25:07.328 blk[1231:7a03] at 56:sleeped 0 s
2014-07-06 15:25:07.328 blk[1231:7a03] at 58:sleeped 2 s
2014-07-06 15:25:07.330 blk[1231:8a03] at 64:sleeped 0 s
2014-07-06 15:25:07.333 blk[1231:9e03] at 75:sleeped 0 s
2014-07-06 15:25:07.333 blk[1231:9e03] at 77:sleeped 0 s
2014-07-06 15:25:07.333 blk[1231:9e03] at 78:sleeped 0 s
2014-07-06 15:25:08.315 blk[1231:1903] at 4:sleeped 2 s
2014-07-06 15:25:08.315 blk[1231:1103] at 1:sleeped 2 s
2014-07-06 15:25:08.315 blk[1231:1503] at 3:sleeped 2 s
2014-07-06 15:25:08.315 blk[1231:1f03] at 7:sleeped 2 s
2014-07-06 15:25:08.315 blk[1231:2303] at 9:sleeped 2 s
2014-07-06 15:25:08.317 blk[1231:2f03] at 15:sleeped 2 s
2014-07-06 15:25:08.319 blk[1231:2303] at 84:sleeped 0 s
2014-07-06 15:25:08.323 blk[1231:4c03] at 28:sleeped 2 s
2014-07-06 15:25:08.323 blk[1231:5203] at 30:sleeped 2 s
2014-07-06 15:25:08.323 blk[1231:5803] at 32:sleeped 2 s
2014-07-06 15:25:08.323 blk[1231:5c03] at 35:sleeped 2 s
2014-07-06 15:25:08.324 blk[1231:5e03] at 38:sleeped 2 s
2014-07-06 15:25:08.324 blk[1231:6603] at 41:sleeped 2 s
2014-07-06 15:25:08.325 blk[1231:5203] at 88:sleeped 0 s
2014-07-06 15:25:08.325 blk[1231:6a03] at 44:sleeped 0 s
2014-07-06 15:25:08.325 blk[1231:5c03] at 90:sleeped 0 s
2014-07-06 15:25:08.325 blk[1231:6c03] at 46:sleeped 0 s
2014-07-06 15:25:08.326 blk[1231:7003] at 48:sleeped 1 s
2014-07-06 15:25:08.327 blk[1231:6a03] at 94:sleeped 0 s
2014-07-06 15:25:08.328 blk[1231:5c03] at 97:sleeped 0 s
2014-07-06 15:25:08.328 blk[1231:5c03] at 99:sleeped 0 s
2014-07-06 15:25:08.329 blk[1231:7a03] at 61:sleeped 3 s
2014-07-06 15:25:08.330 blk[1231:8c03] at 65:sleeped 3 s
2014-07-06 15:25:08.331 blk[1231:8c03] at 102:sleeped 0 s
2014-07-06 15:25:08.333 blk[1231:a003] at 76:sleeped 4 s
2014-07-06 15:25:08.333 blk[1231:9a03] at 73:sleeped 4 s
2014-07-06 15:25:08.334 blk[1231:9a03] at 105:sleeped 0 s
- obj-c编程09:块的语法
- obj-c 语法小结
- obj-c编程04:类的继承
- Object-C 块语法
- Objective-c 块语法
- obj-c编程13:归档
- obj-c编程03:多个参数方法的定义
- obj-c编程18:多对多的观察者模式
- 第一讲:Obj-C 基本语法
- 第二讲:Obj-C 点语法
- ios 开发 OC编程 块语法bolck的一些应用
- Objective-C语法之代码块(block)的使用
- Objective-C语法之代码块(block)的使用
- Objective-C语法之代码块的使用
- Objective-C语法之代码块的使用
- Objective-C语法之代码块(block)的使用
- Objective-C语法之代码块(block)的使用
- Objective-C语法之代码块的使用
- Use CocoaPods With Swift (在 Swift 中使用 CocoaPods)
- java的学习记录9
- 使用Cloudsim实现基于多维QoS的资源调度算法之一:配置Cloudsim环境
- OC中类的创建简单介绍
- hdu 1166 敌兵布阵(线段树)
- obj-c编程09:块的语法
- C++读取一整行字符串
- redis---安装php客户端程序phpredis
- .NET中基本数据类型的GetHashCode
- 设计模式之代理模式
- simple fix 主从不一致滴error
- 获得执行计划方法六-dbms_xplan.diskplay_cursor
- SpringSecurity工具包之AuthorityUtils类
- Git协同工作之——非快进式推送