OC Protocol 协议
一、概述
- 协议就是委托(delegate)/代理,是指一个对象提供机会对另一个对象的变化做出反应或者影响另一个对象的行为。
- 协议只能一个用途,就是为继承的类,声明出一堆方法的声明。
- 基类遵守的协议,其派生类也要遵守其基类遵守的协议,也就是说父类的协议可以被子类继承。
- 在OC中类不能多重继承,只能单继承,而协议却可以多继承。
- 协议声明的方法可以由继承的任意类去实现。
- 协议 <NSObject> 是一切协议的基协议。
- 协议可以遵守协议,也就是说一个协议可以去遵守(继承)其它协议,这样就可以拥有其它协议的所有方法的声明。
- 在协议中还有两个关键字@optional and @required,@optional 修改的方法声明告诉开发者可以这个方法可以实现,也可以不实现。@required修饰的方法声明告诉开发都这个方法必须实现,当然,这两个关键字修改的方法,都可以不去理会,但xcode会给出警告。
二、协议定义格式
1 // 定义的协议名称 遵守协议名称 2 @protocol MyProtocol <NSObject> 3 @required 4 5 @optional 6 7 @end
三、例子
1 // 委托者 DemoViewController.h 2 #import <UIKit/UIKit.h> 3 4 @protocol DemoDelegate <NSObject> 5 - (void)setEditWithValue:(NSString *)aValue; 6 @end 7 8 @interface DemoViewController : UIViewController 9 { 10 id<DemoDelegate> iDelegate; 11 } 12 13 // 此delegate就是setDelegate方法 14 @property (nonatomic, assign) id<DemoDelegate> iDelegate; 15 16 @end 17 18 // DemoViewController.m 19 #import "DemoViewController.h" 20 21 @interface DemoViewController () 22 { 23 NSString *iVarString; 24 } 25 26 @property (nonatomic, copy) NSString *iVarString; 27 28 - (void)print; 29 30 @end 31 32 @implementation DemoViewController 33 @synthesize iDelegate; 34 @synthesize iVarString; 35 36 - (void)print 37 { 38 [self.iDelegate setEditWithValue:@"test"]; 39 } 40 41 @end 42 43 44 // 被委托者,要注意,在被委托中要设置代码理对象 45 // DemoController.h 46 #import <Foundation/Foundation.h> 47 48 #import "DemoViewController.h" 49 50 @interface DemoController : NSObject <DemoDelegate> 51 52 @end 53 54 // DemoController.m 55 #import "DemoController.h" 56 57 @interface DemoController () 58 { 59 DemoViewController *iDVController; 60 } 61 62 @property (nonatomic, retain) DemoViewController *iDVController; 63 64 - (instancetype)initWithValue:(NSString *)aValue; 65 66 @end 67 68 @implementation DemoController 69 @synthesize iDVController; 70 71 - (instancetype)initWithValue:(NSString *)aValue 72 { 73 if (self = [super init]) 74 { 75 self.iDVController = [[DemoViewController alloc] init]; 76 [self.iDVController setIDelegate:self]; 77 } 78 79 return self; 80 } 81 82 - (void)setEditWithValue:(NSString *)aValue 83 { 84 // to do 85 NSLog(@"detail page edit value: %@", aValue); 86 } 87 88 @end
PS: 在被委托中设置的代理对象,就是委托都的成员属性,即:@property delegate的getter and setter方法。
1 @interface DemoViewController 2 { 3 id<DemoController> iDelegate; 4 } 5 6 @property (nonatomic, assign) id<DemoController> iDelegate;