javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-08 13:23:18 | 查看: 269 | 回复: 0

3、块的基本用法,定义如下  ^[块返回值类型](形参类型1形参1形参类型2形参2)  {   //块执行体  }   1)、定义块必须以^开头  2)、定义块返回值类型一般省略  3)、定义块不需要值名字  4)、块的参数可以是(void)  块变量格式  块返回值类型(^块变量名)(形参类型1,形参类型2);   一般使用#import<Foundation/Foundation.h>intmain(intargc,char*argv[]){@autoreleasepool{void(^printStr)(void)=^(void){NSLog(@"我在学习oc的块");};printStr();int(^sum)(int,int)=^(inta,intb){returna+b;};NSLog(@"sumis%d",sum(a,b));void(^print)(NSString)=^(NSString*info){NSLog(@"infovalueis%@",info);};print(@"chenyu");}}  块可以访问局部变量的值,但是不许修改,因为传递进去的是值,不是地址,所以不能修改,following  下面代码会引起错误 intvalue=20;void(^print)(void)=^(void){value=30;NSLog(@"%d",value);}value=45;print();  看下面的例子 intvalue=20;void(^print)(void)=^(void){NSLog(@"%d",value);}value=45;print();  结果打印是20,我们不是修改了成了45吗?当程序用块访问局部变量时,系统在定义块会把局部变量的值保存在块中,而不是等到执行时才去访问获取变量的值,如果考虑块要修改局部变量的值,我们可以用_block修饰局部变量  _blockintvalue=20;void(^print)(void)=^(void){//会打印出45NSLog(@"%d",value);value=40;//会打印出40NSLog(@"%d",value);}value=45;print();//会打印出40NSLog(@"%d",value); 用_block作为修饰的时候可以理解为传递指针到块里面去了,可以修改地址从而修改值 用typedef定义块变量类型,格式如下  typedef块返回值类型(^块变量类型)(形参类型1,形参类型2)

  typedefvoid(^Print)(NSString*);

Printprint=^(NSString*info){NSLog(@"%@info",info);}print(@"chenyu");

  块有点像C语言里面的函数指针。

测试:

typedefint(^Add)(int,int);typedefvoid(^Show)(NSString*);intmain(intargc,char*argv[]){@autoreleasepool{void(^pri)(void)=^(void){NSLog(@"helloworld");};pri();Addadd=^(inta,intb){returna+b;};intresult=add(4,5);NSLog(@"4+5is:%d",result);Showshow=^(NSString*info){NSLog(@"%@",info);};show(@"chenyu");}}

结果:

helloworld4+5is:9chenyu

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017