一、block的概念:
(1),block是一个数据类型,跟int double float一样都是数据类型.所以我们是可以创建一个block类型的变量.
(2).block类型的变量中专门存储一段代码,这段代码可以有参数,可以有返回值.存储的代码段必须要指定代码是否有参数,是否有返回值.一旦指定,这个block就只能存储这样类型的代码,
二、block变量的声明初始化:
(1).声明
语法格式:
返回值类型 (^block变量的名称)(参数列表)
举例:
void (^block1)()//无返回值,无参数
int (^block2)(int num1,int num2)//int类型返回值i,两个int类型参数
(2).初始化(实现):
原理:写一段符合block要求的代码段,存储到block变量中
代码段的书写格式:
^返回值类型(参数列表){
代码段;
};
举例:
//无参数无返回值的代码段
^void(){
NSLog(@"我是无参数无返回值的代码段");
};
//无参数无返回值的代码段
^int(10,10){
NSLog(@"我是有参数有返回值的代码段");
};
代码段赋值给block变量
_block1 = ^void(){
NSLog(@"我是无参数无返回值的代码段");
};
_block2 = ^int(n1,n2){
int num = n1 + n2;
NSLog(@"我是有参数有返回值的代码段");
return num;
};
(3).block代码段调用:
语法格式:
block变量名(参数列表);
举例:
_block1();//执行完会输出:我是无参数无返回值的代码段
(4)关于block简写:
1.如果代码段的返回值为void的话,void可以省略,如:
void (^block1)() = ^(){
NSLog(@"我是无参数无返回值的代码段");
};
2.如果代码段没有参数的话,括号也可以省掉,如:
int (^block3)() = ^int {
NSLog(@"我是无参数省略括号的代码段");
return 0;
};
3.声明block变量的时候,参数可以不写名称,如:
是声明的时候可以省略参数名.但是代码块的话还是要写的.
int (^block4)(int,int) = ^int(int n1,int n2) {
NSLog(@"我是无参数省略括号的代码段");
return n1+n2;
};
(5)block作为函数的返回值:
1,在.h文件下,定义一个新的数据类型
#import "Person.h"
typedef void (^winblock)();
//方法
-(winblock) ttt{
void (^block1)(void) = ^ {
NSLog(@"!!!");
};
return block1;
}
//调用
winblock t = [per ttt];
t();//输出
三、block与函数的区别:
相同点:都是封装一段代码
不同点:
1)block是一个数据类型,函数是一个函数
2)block可以作为函数的参数
block变量多在页面回调的时候使用,把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.