协议(Protocol)与委托代理(Delegate)

协议(Protocol)的作用:

1. 规范接口,用来定义一套公用的接口;

2. 约束或筛选对象。

代理(Delegate):

它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情,目的是为了降低对象间的耦合度;或用来逆向传值。

一、定义一套公用接口

 /** 协议 */
@protocol ExecuteProtocol <NSObject> @required
/**
* @brief 必须实现的某个方法
*/
- (NSUInteger)qualified; @optional
/**
* @brief 可选的方法
*/
- (void)doSomething; @end

协议只有.h文件,没有.m文件。因为 Protocol 仅定义公用的一套接口,并不能提供具体的实现方法。(具体的实现需要某个遵守了协议的类去实现,然后该类就可以作为被筛选出来的对象做些事情,后面会讲到)

假如控制器里面需要用到协议,那么导入协议:

#import "ExecuteProtocol.h"

并且实现协议的 required 方法(否则编译器会warning)

ViewController的代码如下:

 #import "ViewController.h"
#import "ExecuteProtocol.h"
#import "Object.h" @interface ViewController ()
@property (nonatomic, strong) UILabel *label;
@end @implementation ViewController #pragma mark - View lifeCycle
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.label];
[self getHouse:[[Object alloc] init]];
} - (void)getHouse:(id <ExecuteProtocol>)obj {
self.label.text = [NSString stringWithFormat:@"%lu", [obj qualified]];
} #pragma mark - getter Methods
- (UILabel *)label {
if (!_label) {
_label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
_label.textAlignment = NSTextAlignmentCenter;
_label.backgroundColor = [UIColor redColor];
}
return _label;
}
@end

在控制器里面添加一个方法,这个方法的参数必须是遵守了协议的某个对象,所以创建了Object对象:

 #import <Foundation/Foundation.h>
#import "ExecuteProtocol.h" /** 某对象 */
@interface Object : NSObject <ExecuteProtocol> @end

并且实现协议方法:

 #import "Object.h"

 @implementation Object

 - (NSUInteger)qualified {
return ;
} @end

简单的小Demo。

二、代理传值(SecondaryViewController 传值到 ViewController中)

1.在ViewController中

 // ViewController需要 遵守代理
@interface ViewController () <SecondaryViewControllerDelegate> SecondaryViewController *secVC = [[SecondaryViewController alloc] init];
// 指定代理
secVC.delegate = self;
[self.navigationController pushViewController:secVC animated:YES];
 // 实现required代理方法,实现传值,打印结果
#pragma mark - SecondaryViewControllerDelegate Methods
- (void)controller:(SecondaryViewController *)controller text:(NSString *)text {
NSLog(@"%@ %@", controller, text);
}

2.在SecondaryViewController中

1)首先,声明代理

 #import <UIKit/UIKit.h>
@class SecondaryViewController; /**
* @brief 协议方法(类名+Delegate)
*/
@protocol SecondaryViewControllerDelegate <NSObject>
@required
/**
* @brief 传值
*
* @param controller 当前控制器
* @param text 文本值
*/
- (void)controller:(SecondaryViewController *)controller text:(NSString *)text;
@end @interface SecondaryViewController : UIViewController
/**
* @brief 代理用weak修饰(防止内存泄露)
*/
@property (nonatomic, weak) id <SecondaryViewControllerDelegate> delegate;
@end

2)判断代理存在与否和方法是否响应

 /**
* SecondaryViewController
*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
/**
* @brief 判断是否设置了代理并且代理是否响应了代理方法
*/
if (self.delegate && [self.delegate respondsToSelector:@selector(controller:text:)]) {
[self.delegate controller:self text:@"传值"];
}
[self.navigationController popViewControllerAnimated:YES];
}

源码:戳这里

尊重作者劳动成果,转载请注明: 【kingdev】

上一篇:oracle 存储过程 clob 字段 调试


下一篇:32-java 里面list的问题