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