一、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实现交给外界决定.