一、理解协议与代理

协议:

协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。

代理:

代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。

二、协议的使用

在定义协议时,可以通过@required与@optional来配置遵守这个协议必须去实现的方法和可以选择的方法。譬如:

@protocol MyChooseDayViewDelegate<NSObject>
@required
- returnChooseDay:(id)myChooseDayView;
@optional
- hideThisView;
- changeDateFormatter:(NSString*)formatString;
@end

在定义的协议 MyChooseDayViewDelegate中,如果遵守该协议,就必须实现协议中的- returnChooseDay: 方法,同时可以根据实际程序要求去实现- hideThisView 与 - changeDateFormatter: 。

同时,协议支持对本身的一种扩展,譬如:

@protocol MyChooseTimeViewDelegate< MyChooseDayViewDelegate>
- doSomething;
@end
//MyChooseTimeViewDelegate扩展了MyChooseDayViewDelegate这个协议,也就是说,假如遵守了MyChooseTimeViewDelegate的话,也必须实现MyChooseDayViewDelegate中的方法(@required)使用分类的话,就是在定义类的头文件中使用<> 将所需要的协议引入,如果引入多个协议,用","分隔,譬如:
@interface MyClassView:UIViewController <MyChooseDayViewDelegate, UIAlertViewDelegate>
//TODO: balabalabala...
@end

想要检查某个类是否实现了某个协议或者某个类是否实现了某个协议的方法,可以通过以下方式来进行测试

//获取某个对象
MyClassView *myClassView = xxxxxxx;
//判断该对象是否实现了MyChooseDayViewDelegate协议
if([myClassView conformToProtocol:@protocol (MyChooseDayViewDelegate)]){
//TODO: balabalabala...
}
//判断对象是否实现了某个方法就用我们经常会使用到的
if([myClassView responseToSelector:@selector(xxxx)]){
//TODO: balabalabala...
}

三、代理
代理在iOS开发会被经常使用,而且代理的使用往往配合着协议。我重复一次我对他的理解,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。
举例来说,我在办公室里正在写代码,突然发现口很渴像喝瓶冰百事,但下楼是件麻烦的事情,我不愿意下楼。这个时候我想起小卖部可以商品加价2元就外送到家服务,我就打电话给小卖部,委托小卖部给我送一瓶水上来。这个时候,小卖部就是我的代理,我委托他帮买水并送上来。这个例子中小卖部是我的代理,商品加价2元外送到家服务就是商品买卖协议(这个叫法肯定不是最佳的,姑且这么叫吧)中的一个方法。
不要觉得麻烦,我们再最后理一遍,小卖部遵守商品买卖协议,我让小卖部成为了我的代理,代替我完成了买瓶冰百事的事情。
以iOS开发的角度来说,UIViewController想使用一个tableview,需要遵守UITableviewDataSource,UITableViewDelegate这2个协议,同时设置tableview的代理为自身,才可以完整的实现Table。

四、代理与协议的使用
我尽可能的用代码来进行描述,但首先需要进行一些context铺垫
我想实现的功能:我要自定义一个View,这个view可能展示了我自己项目中特定的一些信息,它可能是若干控件的组合,譬如UITextField、UISwitch、UIDatePicker、balabalabala...我们姑且叫这个view为myInformationView  我在一个ViewController使用了这个view,为了方便,这个ViewController就叫myRootViewController。在使用这个myInformationView时,我需要即时的在myRootViewController获取并做相应的处理。这是我想实现的功能。
接下来,就是开始写代码的时刻:
1.首先是一个protocol

#import <Foundation/Foundation.h>
@class MyInformationView; @protocol MyInformatioViewDelegate<NSObject>
@required
@returnValueToShow:(MyInformationView*)myInformationView; @end

2.MyInformationView

#import <UIKit/UIKit.h>  

@interface MyInformationView : UIView  

@property (nonatomic, strong) id<MyInformationViewDelegate> myDelegate;  

- (id)initWith......//初始化视图的方法
//所需要的属性和方法根据实际需要再行添加
@end
#import "MyInformationView.h"
@interface MyInformationView() @end @implementation MyInformationView
@synthesize myDelegate = _myDelegate; //Todo: 处理一些初始化方法和其他一些事件 // changeMyInformationData 是操作此view可能产生的数据变动。它可能是选择器变动、点击按钮等等,但我们并不想在此view处理它,因为它的变动可能对调用此view的controller造成影响,所以...
- (void) changeMyInformationData:(id)sender

//TODO:数据变动....
if ([self.myDelegate respondsToSelector:@selector(returnValueToShow:)]) {
[self.myDelegate returnValueToShow:self];
}
} @end

3.ViewController
这里就不写代码了,在头文件中声明此类遵守MyInformationViewDelegate协议。在实现文件(.m)中,调用MyinfomationView的时候,设置代理成自己,

MyInformation *myInfoView = [[MyInformation alloc] init.......];
myInfoView.myDelegate = self; //实现协议中要求实现的方法
- (void)returnValueToShow:(MyInformationView*)myInfoView
{
//TODO:做想做的事情
}

这样就是一整套完整的代理与协议组合用法了。但其实代理与协议还可以做更多的事情,例如在页面切换时(A页面进入AA页面)...通过传入,使AA成A的代理,并对其进行操作来方便处理一些问题。

ios开发之代理&&协议(补充篇)的更多相关文章

  1. ios开发之代理&&协议

    Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎么做 ...

  2. iOS开发之多线程技术——NSOperation篇

    本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...

  3. 聊聊 iOS 开发中的协议

    前言 何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性.方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category.在 ...

  4. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  5. iOS开发——高级技术精选OC篇&Runtime之字典转模型实战

    Runtime之字典转模型实战 如果您还不知道什么是runtime,那么请先看看这几篇文章: http://www.cnblogs.com/iCocos/p/4734687.html http://w ...

  6. iOS开发之多线程技术——GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  7. ios开发——常用经典算法OC篇&冒泡/快速

    冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...

  8. iOS开发之多线程技术—GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  9. ios开发——实用技术OC-Swift篇&触摸与手势识别

    iOS开发学习之触摸事件和手势识别   iOS的输入事件 触摸事件 手势识别 手机摇晃 一.iOS的输入事件   触摸事件(滑动.点击) 运动事件(摇一摇.手机倾斜.行走),不需要人为参与的 远程控制 ...

随机推荐

  1. unity3d 雪与沙的渲染

    很简单的一个shader,跟着上一篇地形顺便弄的 方法就是基于物理的diffuse,再加上noise权重的specular 公式参考 JOURNEY JOURNEY中认为OrenNayar比较浪费,所 ...

  2. 曾经的岁月之maya

  3. Linux给用户增加sudo权限

    有时候我们在Linux下执行sudo的时候,出现 xxx is not int the sudoers file 告诉我们当前用户不是sudoer,所以我们要把当前用户添加进去,步骤如下: 1.进入超 ...

  4. HDOJ 1716 排列2 next_permutation函数

    Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡 ...

  5. vijosP1059 积木城堡

    vijosP1059 积木城堡 链接:https://vijos.org/p/1059 [思路] 01背包. 刚开始想麻烦了,想的是二分答案然后01背包判断是否可行,但是首先答案不满足单调性所以不能二 ...

  6. JDBC高级部分

    /** 采用模版类型,封装了基本数据的CRUD操作 基本属性从外部属性文件读取(如config.properties) */public class BaseDao<T> { privat ...

  7. 高性能I/O设计模式Reactor和Proactor

    系统I/O 可分为阻塞型, 非阻塞同步型,非阻塞异步型. (Linux对aio支持的不完整,所以linux上用Reactor比较多:Proactor需要系统API支持真正的“异步”) 阻塞型I/O意味 ...

  8. HDU-1300(基础方程DP-遍历之前所有状态)

    Problem Description In Pearlania everybody is fond of pearls. One company, called The Royal Pearl, p ...

  9. 贵价的高级衣物清理法小Tipp之观察别人当然要从脚看起咯!

    贵价的高级衣物清理法小Tipp之观察别人当然要从脚看起咯! 贵价的高级衣物清理法小Tipp之观察别人当然要从脚看起咯!

  10. 虚拟机linux系统下ifconfig获取不到ip

    原因:网卡未激活 1.输入ifup eth0命令激活网卡 2.输入ifconfig查询ip