三维地图:遥馨平台优化,李永波 龚智超,姚明中文网
block代码块是对c做出的一个补充,初次体验代码块,无比的不适应。古怪的语法确实让人不易入门甚至精通。但若能够深入精通block的使用,会给代码带来层次上的提升。block就是一段在将来被执行的代码
^[块返回值类型](形参类型1 形参1,形参类型2 形参2,...) { //块执行任务 }
块返回值类型 (^块变量名)(形参类型1,形参类型2,...);
//定义块变量 void(^nslogstr)(); //通过块变量调用块 nslogstr=^(void) { };
//定义无返回值不带参数 void (^nslogstr)()=^() { //代码块实现的方法 nslog(@"hello block"); }; //通过代码变量调用代码块 nslogstr();
但当为局部变量加上 __block
修饰就可以修改局部变量
__block int a=10; void (^nslogstr)()=^() { //读取局部变量a,是可以的 nslog(@"%d",a); //试图修改局部变量,错误的。无法运行通过 a=20; nslog(@"%d",a); nslog(@"hello block"); }; //通过代码变量调用代码块 nslogstr();
2016-05-01 16:20:23.860 [2470:103092] 10 2016-05-01 16:20:23.861 [2470:103092] 20 2016-05-01 16:20:23.861 [2470:103092] hello block看下面代码
int a=10; void (^nslogstr)()=^() { //读取局部变量a,是可以的 nslog(@"%d",a); nslog(@"hello block"); }; a=30; //通过代码变量调用代码块 nslogstr(); nslog(@"%d",a);
猜猜应该打印的值是多少?两个a都是30?
2016-05-01 16:27:57.600 [2543:107259] 10 2016-05-01 16:27:57.601 [2543:107259] hello block 2016-05-01 16:27:57.601 [2543:107259] 30
why?
原来,在定义代码块时就已经把局部变量的值复制到块 。所以即使在定义后、调用前修改局部变量,依然是没有用的。 倘若我们我们想等到执行时才去访问获取甚至去修改局部变量的值,我们可以在局部变量前面加__block
这时候我们需要引入一个typedef
用typedef可以定义代码块类型,主要有两个作用
复用块变量类型,使用块变量类型可以重复定义多个块变量
使用块变量类型定义函数参数,这样可定义带块参数的函数
typedef 块返回值类型(^块变量类型)(形参类型1,形参类型2,....);
定义一个函数,block作为函数最后一个参数
typedef nsstring* (^logstr)(nsstring *); void nslogstr(nsstring *name,logstr log) { nslog(@"%@%@",log(name),@",欢迎您"); } 调用: nsstring *name=@"乔布斯"; nslogstr(name, ^nsstring *(nsstring *name) { return name; });
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论