一、protocol协议
1、协议的定义
@protocol 协议名称 <NSObject> // 方法声明列表.... @end
2、如何遵守协议
① 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2> @end
② 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2> @end
③ 协议中方法声明的关键字
1> @required (默认) 要求实现,如果没有实现,会发出警告
1 @required 2 - (void)test; 3 - (void)test2;
2> @optional 不要求实现,怎样不会有警告
1 @optional 2 - (void)test3;
④ 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称>*变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj; id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
⑤ @property中的声明的属性也可用作一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名; @property (nonatomic, strong) id<协议名称> 属性名; @property (nonatomic, strong) Dog<MyProtocol> *dog; @property (nonatomic, strong) id<MyProtocol> dog2
⑥ 协议可用定义在单独.h文件中,也可以定义在某个类中
*如果这个协议只用在某个类中,应该把协议定义在该类中
*如果这个协议用在很多类中,就应该定义在单独文件中
⑦ 分类可用定义在单独.h和.m文件中,也可用定义在原来类中
*一般情况下,都是定义在单独文件
3、程序举例
1 // 要求obj3保存的对象必须是遵守是MyProtocol这个协议 2 3 //NSObject<MyProtocol> *obj3 = [[NSObject alloc] init]; 4 5 NSObject<MyProtocol> *obj3 = [[Person alloc] init]; 6 7 obj3 = nil; 8 9 10 id<MyProtocol> obj4 = [[Person alloc] init]; 11 12 obj4 = nil; 13 14 // 要求obj5,保存的对象必须遵守MyProtocol3、并且继承了Person 15 Person<MyProtocol3> *obj5 = [[Person alloc] init]; 16 17 obj5 = nil;
二、block
block封装了一段代码,可以在任何时候执行,block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
1、 block的定义
1 int (^sumBlock)(int, int); 2 void (^myBlock)();
2、 利用block封装代码
^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); };
3、block访问外面的变量
① block内部可以访问外面的变量
② 默认情况下,block内部不能修改外面的局部变量
③ 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
1 void test3() 2 { 3 int a = 10; 4 __block int b = 20; 5 6 void (^block)(); 7 8 block = ^{ 9 // block内部可以访问外面的变量 10 //NSLog(@"a = %d", a); 11 12 // 默认情况下,block内部不能修改外面的局部变量 13 // a = 20; 14 15 // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 16 b = 25; 17 }; 18 19 20 block(); 21 }
4、 利用typedef定义block类型
1 MyBlock block; 2 MyBlock b1, b2; 3 4 b1 = ^(int a, int b) { 5 return a - b; 6 }; 7 8 MyBlock b3 = ^(int a, int b) { 9 return a - b; 10 }; 11 */ 12 13 typedef int (*SumP)(int, int); 14 15 16 typedef int (^MyBlock)(int, int); 17 18 int sum(int a, int b) 19 { 20 return a + b; 21 }