前不久老大辞职了,手上IOS的工作就扔给了我,于是只能开始学习苹果的东西,说真的从java转到OC,对于苹果的东西,可以说是零基础了,连Mac都没用过,于是开始研究如何在Mac上安装/卸载软件;苹果的东西不熟,各种限制;特别是发布审核流程,审核被拒绝了,你们搞了一个星期才能重新提交审核。不过幸好有IOS技术群,在那里获得了很热心大帮助;在IT这个大家庭里,总是能相互分享,相互帮助,相互进步,这也许也是互联网发展如此迅猛的原因之一吧。好吧,牢骚感慨发完了!
写文章是因为一个是记性不是很好,还是那句话:好记性不如烂笔头;一个是因为开始觉得学过的东西很应该总结成文档,这不仅有助于知识的积累,也在无形中锻炼一个人总结归纳能力。今晚的文章主要记录关于Object C中块(Block)的一些知识;下面是今天的提纲:
1.什么是块?
2.块的定义
3.块访问局部变量
4.块作参数以及块变量的定义
1.什么是块?
其实在很多函数式编程里面都有块这种逻辑单元结构存在。而Object-C中的块(Block)是Object-C对ANSI C所作的扩展,作为Object-C的一种逻辑单元;块类似于函数,或者可以说是匿名函数;它可以有返回值,可以有参数传入块;
2.块的定义
^[返回值类型] (形参类型1 形参1,形参类型2 形参2,...)
{
//块的执行体;
}
说明:
1)块体的定义必须以 " ^ "开头;
2)块的返回值类型可以省略,而且经常都会省略声明块的返回值类型;
3)块定义不一定要指出块的名字
4)如果块无返回值,需要用void占位符;同理,当块无参数时,也建议用void作占位符
5)如果程序中需要多次调用已经定义到块,那么建议为该块取一个变量名;其声明格式如下:
声明:
块返回值类型 ( ^ 块变量名)(形参类型1 形参1,形参类型2 形参2,...);
实现:
块变量名=^(形参类型1 形参1,形参类型2 形参2,...)
{
//块执行体;
}
或者这样:
块返回值类型 ( ^ 块变量名)(形参类型1 形参1,形参类型2 形参2,...)=^(形参类型1 形参1,形参类型2 形参2,...)
{
//块执行体;
}
例如:
void testBlock(){
void (^ddd)(void)=^(void){//不带参数和返回值的块声明实现
NSLog(@"ddddddddd");
};
ddd();//调用
void (^ded)(NSString *);//块声明
ded=^(NSString *str){//实现
NSLog(@"============>%@",str);
};
ded(@"1234321");//调用
}
3.块访问局部变量
由于系统在定义块时就已经将块中使用到的局部变量的值复制保存到块中;而不是等到执行时才去访问局部变量的值;所以在块外部对局部变量做修改,对块不存在任何影响;如果在定义变量时不希望系统把局部变量的值复制到块中;而是等到执行时才去获取局部变量的值;甚至希望块也可以修改局部变量,则可以使用_block关键字修饰局部变量
4.块作参数以及块变量类型的定义
1)当把块做为函数参数时,无需定义块变量,可以直接将块体传递进去即可,特别注意:块作为函数参数时,只能作为函数的最后一个参数,并且一个函数最多只能包含一个块参数。2)块变量类型的定义类似于C语言结构体类型变量的定义:同样使用typedef关键字;格式如下:
typedef 块返回值类型 (^ 块变量类型)(形参类型1 形参1,形参类型2 形参2,...);
例如:
typedef void (^ ZonteleBlock) (NSString *);
ZonteleBlock block=^(NSString* info)
{
NSLog(@"block");
};
block(@"dddddd");//调用