协议(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】

协议(Protocol)与委托代理(Delegate)的更多相关文章

  1. 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

    协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...

  2. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  3. 协议(Protocol) 和代理(Delegate)

    1.概念与组成 delegate是iOS中一种常见的设计模式,是一种消息传递的的方式,常见的消息传递方式还有以下几种: 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. ...

  4. 协议Protocol

    1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口.           遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议.       ...

  5. Objective-C:协议protocol

    六.协议(protocol) 关键字:@optional.@required (1)是一个类共享的一个方法列表 (2)它声明了一系列的方法而不进行实现 (3)遵从某个协议,就是需要实现协议中的方法 ( ...

  6. iOS阶段学习第19天笔记(协议-Protocol)

    iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者      之间通讯的一种方式 2) ...

  7. OC基础--分类(category) 和 协议(protocol)

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  8. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  9. Objective-C中的协议(Protocol)和类别(Category)

    1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...

随机推荐

  1. poj 2407 欧拉函数裸题

    http://poj.org/problem?id=2407 题意:多组数据,每次输入一个数 ,求这个数的欧拉函数 int euler_phi(int n){//单个欧拉函数 int m=(int)s ...

  2. Mac终端操作移动硬盘文件命令

    桌面上看到的硬盘都挂载在 /Volumes目录下 例如移动硬盘名为ZTB,有System目录,则应输入命令: cd /Volumes/ZTB/System 注意:进入Volumes目录命令为cd /V ...

  3. 黑马学习ajax&json 笔记

    ## 今日内容 1. AJAX: 2. JSON # AJAX: 1. 概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1. 异步和同步 ...

  4. JXl常用解析详解

    目的: java解析 excel 无非就是apache poi 或者 jxl 两者在使用上其实都差不多,关键还是看你自己熟悉那个,用那个!我也是初次接触jxl 看很多博客说 jxl只适用于处理小数据量 ...

  5. Js 验证时间格式是否正确

    function RQcheck(RQ) { var date = RQ; //(-|\/)分隔符 var result = date.match(/^(\d{1,4})(-|\/)(\d{1,2}) ...

  6. 11.联结表---SQL

    说明:使用交互式DBMS工具重要的是,要理解联结不是物理实体.换句话说,它在实际的数据库表中并不存在.DBMS会根据需要建立联结,它在查询执行期间一直存在. 一.等值语法:SELECT 字段 FROM ...

  7. linux 03 命令 续

    linux 03 命令 续 一.vim 两种操作方式:新文件 pyvip@Vip:~/demo/2_3$ vim demo.txt #操作一个新文件 一开始进入的是命令模式,按i进入插入模式,开始编辑 ...

  8. Hive进阶_开发Hive的自定义函数

    Hive中的自定义函数简介 (1) 在类中创建自定义函数.自定义UDF需要继承'org.apache.hadoop.hive.ql.exec.UDF',实现evaluate函数,evaluate函数支 ...

  9. Dell服务器安装系统中遇到的坑

    在本学期开学初期,由于后续实验的需要,老师为我们配置了服务器,该服务器的型号为Dell Power R730. 由于我也是一个小白,在服务器安装系统的过程中,遇到了一些麻烦,在这里记录下来,希望自己能 ...

  10. Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

    最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...