1. 格式:
1)
有参有返回值
格式:
返回值类型 (^变量名)(参数类型及个数) = ^(形参列表){
代码块语句;
return ;
};
2)
有参无返回值
格式:
void (^变量名)(参数类型及个数) = ^(形参列表){
代码块语句;
};
3)
无参无返回值 block
格式:void (^block变量名)() = ^(){
代码块的语句;
};
优化:
void (^block变量名)() = ^{
代码块的语句;
};
4) block变量的使用:
block变量名();
2.
给block起一个别名,
Block 是一个类型,不在是一个单纯的变量了
3.
block访问外部变量:定义变量,并且赋值。
当定义block的时候,block会把外部变量以const的方式复制一份,
存放到block的所在的内存中。
定义变量时:以__block修饰,外部变量将不以const方式拷贝。在block内部修改外部变量值之后,该外部变量将会被修改
。
4. 返回值是
block类型的定义步骤:
1)使用 typedef 定义一个新的类型
2)用新定义的类型作为函数的返回值
3)定义block变量接收 函数返回的结果
4)执行block
5. block使用技巧
1)
block助记符:
inlineBlock
2)
我们在定义block变量的时候,形参类型及个数这个位置处可以
加上形参名称
二、Protocol
1.
什么是协议:
一些方法的声明,一般写到一个.h的头文件中
分类:1)必须要实现
2)选择实现
2. 作用:
供其他的类去遵守,
如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法。
3. 定义协议:
@protocol xxx <NSObject> 默认情况下遵守 NSObject协议
@end
4. 类遵守协议的格式:
1)遵守一个协议:
先导入头文件
@interface 类名 :NSObject <xxx>
@end
2)遵守多个协议
@interface 类名 :NSObject <xxx,aaa,bbb>
@end
5. 使用协议的流程:
1) 定义协议
2)让类遵守这个协议
3)实现协议中对应的方法(必须要实现的)
6. 遵守协议的流程:
1)导入 头文件
2)遵守协议
3)实现方法
结论:当我们遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明
7. 注意事项
1) 一个协议,可以遵守其他的协议
2)一个类可以遵守多个协议
3)一个协议可以被多个类遵守
8. 关键字
@required 和 @optional 都是协议中的关键字
@required 修饰的方法是必须要实现的,默认是必须实现的
@optional 修饰的方法是可以实现,也可以不实现的
9. 类型限制
1)第一种类型限制:给id类型增加限制
2)id类型的对象赋值的时候,必须是某个对象,并其遵守 了要求的协议
3)在get方法中加限制,要求某一对象遵守要求的协议
10.
@protocol 协议名
1)要遵守这个协议的类,用@protocol 告诉编译器这是一个协议
2)在.m 文件中,导入协议头文件
3)在main函数中,也要导入协议的头文件