一、block
1.定义
block 其实就是一个代码块, 储存了一段代码.
block是一种数据类型. block类型的变量用(^blockName)形式表示.
block和函数相似, 可以有参数, 有返回值, 调用方式也相似.
但是函数必须定义在main函数的外面, block的定义位置可以任意. 函数不能访问它外部的局部变量, block可以.
2.使用
1>没有参数的block
比如打印"Hello!"
// 定义
void (^printHello)() = ^{
NSLog(@"Hello!");
};
// 注:等号 ^后面其实有个(), 表示没有形参, 但是没有形参时可以省略
// 使用:
printHello();
2>有参数的block
比如返回两个整数的和
// 定义
int (^sum)(int, int) = ^(int a, int b){
return a+b;
};
// 使用
int s = sum(3, 5);
Block可以访问局部变量,但是不能修改。
int sum = 10;
int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
};
如果要修改就要加关键字:__block
__block int sum = 10;
3. 使用typedef来简化书写
block的定义可以使用typedef来简化.
1>定义
typedef int (^CalcBlock)(int, int);
表示可以使用CalcBlock来定义有两个int参数, 返回值为int类型的block.
2>使用举例
<span style="font-size:18px;font-weight: normal;">CalcBlock sumBlock; // 表示sumBlock是一个CalcBlock类型的block
sumBlock = ^(int a, int b){
return a+b
}; // 给这个block赋值
CalcBlock mulBlock = ^(int a, int b){
return a*b
}; // 定义+赋值</span>
二、Protocol协议
1、用途:
2、协议的定义
3、关键字
4、遵循协议
5、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
6、@property中声明的属性也可做一个遵循协议的限制
7、协议可以定义在单独.h文件中,也可以定义在某个类中(一般单独定义)