—-Java培训、Android培训、iOS培训、.Net培训、期待与您交流!—-
一、block
1.block基本认识
<1>.block是一种数据类型。
<2>.block类型的数据封装了一段代码,可以在任何时候执行。
<3>.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
<4>.block的作用:封装一段代码,以便随时调用,简称代码块
<5>.block跟函数很像:
1>可以保存代码
2>有返回值
3>有形参
4>调用方式一样
2.block变量的定义、赋值、调用
<1>.block类型的标志:^
<2>.block变量的定义、赋值、调用
block的形式和指向函数的指针非常相似
//定义函数指针: 返回值int类型,2个int类型形参
int (*p)(int, int);
//定义Block: 返回值int类型,2个int类型形参
int (^sumBlock)(int, int);
定义一个block类型变量,保存一段求和代码
//1.定义Block变量sumBlock,返回值int,2个形参int
int (^sumBlock)(int, int);
//2.给sumBlock封装一段代码(如果没有形参,^后面的()可以省略)
sumBlock = ^(int a, int b)
{
return a + b;
};
//3.调用sumBlock代码块,得到返回值
int c = sumBlock(7, 8);
注意:封装代码完后,大括号后面一定要加分号;
3.block访问外面变量
<1>.block内部可以访问外面的变量
<2>.默认情况下,block内部不能修改外面的局部变量
<3>.给局部变量加上_block关键字,这个局部变量就可以在block内部修改
int main()
{
int a = 5;
_block int b = 10; //给局部变量加上_block关键字,这个局部变量就可以在block中修改
void (^block1)(); //定义block类型的变量为block1,并且省略形参类型
block1 = ^{ //给block1赋值(把代码块存入block1)
//1.block内部可以访问外面的变量
NSLog(@"a = %d", a);
//2.默认情况下,block内部不能修改外面的局部变量
// a = 15;
//给局部变量加上_block关键字,这个局部变量就可以在block中修改
b = 20;
};
block1(); //调用block1中封装的代码块
return 0;
}
4.利用typedef定义block类型
//以后就可以利用myBlock这种类型来定义block变量
typedef int (^myBlock)(int, int);
myBlock b1;
b1 = ^(int a, int b){
return a + b;
};
或者另一种表达方式
myBlock b2 = ^(int a, int b){
return a - b;
};
二、protocol(协议)
1.protocol的用途
<1>.将一大堆方法声明(不能声明成员变量)写在protocol协议中,只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明。
<2>.只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
<3>.只要父类遵守了这个协议,就相当于子类也遵守了。
<4>.常用于设计模式:代理模式、观察者模式
2.protocol的协议格式
<1>.协议的编写
@protocol 协议名称 <NSOjbect>
方法声明列表
@end
<2>.某个类遵守协议
@interface 类名 :父类名 <协议名称1,协议名称2>
@end
3.关键字@required和@optional
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多情况下用途在于程序员之间的交流
<1>.@required:这个方法必须要实现,如果没有实现会发出警告
<2>.@optional:这个方法不一定要实现,怎样都不会有警告
4.协议遵守协议
<1>.一个协议可以遵守其他多个协议,多个协议之间用逗号隔开
<2>.一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
5.基协议
<1>.NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
<2>.其实还有一个协议,名字也叫NSObject,他是一个基协议
<3>.NSObject协议中声明很多最基本的方法,比如:description,retain,release等
<4>.建议每个新的协议都要遵守NSObject协议
6.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
格式
<1>.类名 <协议名称> *变量名;
NSObject <Myprotocol> *obj;
<2>.id <协议名称> 变量名;
id <Myprotocol> obj2;
7.@property中声明的属性也可用做一个遵守协议的限制
格式
@property (nonatomic, strong)类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称>属性名;
举例
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) id dog2;
8.协议的文件结构
协议可用定义在单独.h文件中,也可用定义在某个类的.h文件中
<1>.如果这个协议只用在某个类中,应该把协议定义在该类.h文件中
<2>.如果这个协议用在很多类中,就应该定义在单独文件中
9.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
<1>.一般情况下,都是定义在单独文件
<2>.定义在原来类中的分类,只要求能看懂语法
10.协议的应用 ->代理模式
普通题目:一个人让一个代理帮他买电影票,内容是票价多少钱?还剩多少张?
分析思路:
这种情况下,我们就可以把a当做是p的代理。
<1>.创建一个Person类型的对象p
<2>.创建一个Agent类型的对象a,
<3>.在p中定义一个Agent类型对象成员,将a赋值给p的Agent类型对象
<4>.在Agent类中实现【买票过程】这个对象方法
<5>.Person中实现【买票】方法,买票方法中直接调用Agent中的【买票过程】方法
通过这种思路,我们就不需要关心a的买票过程,需要买票时,只要调用代理的方法就好了