一.Block
1.基本概念
BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码。用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行。
BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样。
标识符为^
// 用一个block输出n条横线 void (^lineBlock)(int) = ^(int n) { for (int i = 0; i<n; i++) { NSLog(@"----------------"); } }; lineBlock(5);
2.如何定义block变量
int (^sumBlock)(int, int); void (^myBlock)();
3.如何利用block封装代码
^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); };
4.block访问外面变量
- block内部可以访问外面的变量
- 默认情况下,block内部不能修改外面的局部变量
- 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
5.利用typedef定义block类型
typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b) { return a - b; }; MyBlock b3 = ^(int a, int b) { return a - b; };
二.Protocol
1.基本用途
用来声明一大堆的方法(不能声明成员变量),不能写实现。
2.特性
1)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
2)只要父类遵守了某个协议,那么子类也遵守。
3)Protocol声明的方法可以让任何类去实现,protocol就是协议。
4)OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
5)基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
6)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
3.如何遵守协议
1) 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2> @end
2) 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2> @end
4.协议中方法声明的关键字
1) @required (默认)
要求实现,如果没有实现,会发出警告
2) @optional
不要求实现,怎样不会有警告
5.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj; id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
[email protected]中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog; @property (nonatomic, strong) id<MyProtocol> dog2;
7.协议可用定义在单独.h文件中,也可用定义在某个类中
1) 如果这个协议只用在某个类中,应该把协议定义在该类中
2) 如果这个协议用在很多类中,就应该定义在单独文件中
8.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1) 一般情况下,都是定义在单独文件
2) 定义在原来类中的分类,只要求能看懂语法