Block和Protocol
block的基本使用
什么是block?
Block是iOS中比较特殊的数据类型
.Block是苹果官方特别推荐使用的数据类型,应用场景比较广泛.
应用场景:
- 动画
- 多线程
- 集合遍历
- 网络请求回调
Block的作用:
用来保存一段代码
,可以在恰当的时间再取出来调用.
功能与函数或者方法比较类似.
函数与Block的区别:
函数不能在程序运行的过程中定义代码,函数是一开始的时候就已经写死的.block也是用来保存代码.
Block保存代码:把代码放到大括号中,在大括号的左大括号前面加上一个^
标志是一个Block(这^的目的是说明后面的代码段要交给block存储),在大括号的右边大括号后面加上分号表示这个数据类型定义结束.以上这些相当于int a=10;中的数值10;
定义简单的Block变量(block跟函数很像,有返回值,有参数):
没有返回值时在前面写void,把变量名括起来,前面加个^,这样就代表block类型的变量名.logDonkeyTao是这个block的变量名,logDonkeyTao的变量中就存储了大括号中的代码.
- void:代表是返回值类型
- (^logDonkeyTao):代表block的变量名
- ():代表block的参数
block跟函数很像,只是在前面加一个^,然后在外面加一对括号.
block的调用:logDonkeyTao();
区别:block可以在函数里面定义也可以在外面定义,更加灵活.
void (^logDonkeyTao)()^{
TFLog(@"------------");
NSLog(@"Donkey-Tao");
NSLog(@"------------");
}
定义一个block,存储一段代码,这段代码的功能是可以打印任意行数的*
void (^logDonkeyTao)(int)=^(int numberOfLines){
for(int i=0;i<numberOfLines;i++){
TFLog(@"------------");
NSLog(@"Donkey-Tao");
NSLog(@"------------");
}
}
调用block:
定义一个block计算两个整数的和
先写block:
//定义有返回值有参数的block
int (^sumBlock)(int,int)=^(int num1,int num2){
return num1+num2;
};
int c=sumBlock(10,9);
int(^doubleBlock)(int);
doubleBlock=^(int num){
return 2*num;
}
//调用
int d=doubleBlock(18);
block和typedef
typedef exisiting new;
typedef int Myint;
//定义一个block来计算2个整数的差
int (^minusBlock)(int,int)=^(int num1,int num2){
return num1-num2;
}
//定义一个block来计算2个整数的积
int (^multiBlock)(int,int)=^(int num1,int num2){
return num1*num2;
}
//定义一个叫做MyBlock的数据类型,它存储的代码必须返回int,必须接受2个int类型的参数
typedef int(^MyBlock)(int,int);
MyBlock minusBlock=^(int num1,int num2){
return num1-num2;
}
03-Block03-使用场景
严谨:调用block之前一定要判断block是否为空
04-Block04-使用注意
1.默认情况下,block里面是能够访问外面的内容的,block里面不能修改外面的数值.
2.要想修改外面的值,__block int b=10;这样就可以修改外面的变量的值.
3.
05-Protocol01-基本使用
protocol翻译过来就是”协议”,协议文件中只有方法的声明.可以把多个类共有的方法抽取出来,用一个协议来表示.一个类可以遵循多份协议.一个协议也可以遵守协议.
协议与父类不同,使用协议可以少一个类,使用继承时多一个
protocol的作用:
- 用来声明一些方法
protocol的其他使用,
协议中的关键字