一、理解协议与代理



协议:

协议就是需要相互遵守的约定、规范;需要去实现协议中规定的方法。

代理:



代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。代理模式是一种设计思想,是人们在开发过程中经验的积累与总结,他们发现,以这样的形式去写代码,会降低代码间的耦合,这样就能增加代码的重用性,就能提高开发效率,节省开发时间。

二.协议的关键词

@required:表示必须实现的方法   (默认)
@optional:表示可以实现也可以不是实现的方法

三,代理

1.1明星打官司,一般明星是不会亲自去的,一来在这样的公众场合抛头露面确实不太方便,再者就是,所谓打官司就是摆事实讲道理,别看明星台词背得很瓷实:“ 男:对,你无情你残酷你无理取闹!  女:那你就不无情!?不残酷!?不无理取闹!?  男:我哪里无情!?哪里残酷!?哪里无理取闹!?  女:你哪里不无情!?哪里不残酷!?哪里不无理取闹!?  男:我就算在怎么无情再怎么残酷再怎么无理取闹也不会比你更无情更残酷更无理取闹!  女:我会比你无情!?比你残酷!?比你无理取闹!?你才是我见过最无情最残酷最无理取闹的人!  男:哼,我绝对没你无情没你残酷没你无理取闹!  女:好,既然你说我无情我残酷我无理取闹我就无情给你看残酷给你看无理取闹给你看!  男:看吧,还说你不无情不残酷不无理取闹现在完全展现你无情残酷无理取闹的一面了吧!” what a fuck!明星自然知道,如果把这个用到官司里,估计所有人都疯了。所以,他们一般都会找(委托)一个律师去帮他处理,律师就成了这个明星的委托人。
            我们想要学习IOS开发,但自己学习太难了,所以来这里,委托千锋教你学习。千锋成了帮你提高的代理人。当然千锋的BOSS并不直接给大家上课,而是委托我们老师来给大家讲课,我们就是千锋的代理人。

        1.2 正向代理与反向代理
        请原谅我使用这两个词,但是,从理解和学习今天的知识来说,我们可以这样先这样来分一下。
        明星委托律师打官司,律师并不是无偿的,他会收取明星的佣金。
        我们可以这样来看,明星委托律师打官司,此时,律师是明星的代理。而律师又委托明星给他支付酬劳,明星就是律师的代理了。
        如果还不好理解,我重新给大家讲这个故事。
        一个人,他想赚钱,他找到一个明星,跟明星说,你是大明星,有很多钱,你能给我点嘛?(律师委托明星)明星想了想,说,这样,我现在有点小麻烦,你帮我搞定了(明星委托律师),这些就都是你的了。
        这就是我所谓的正向代理与反向代理。
        不过,我们也可以这样来看,把他分为两块。单看明星找律师打官司,以明星作为主视角,那么律师就是明星的代理。
        再者,律师找明星弄点钱,以律师为主视角,那么明星就是律师的代理。
        如果分为两块,每块的主视角不一样,则都属于正向代理了。
        就像1,2,3,4,5,6,7,8,9,10 这组数,我们说是从小到大排列的。但如果是古人,他可能会说是从大到小排列的,主视角或出发点不同而已。

1.3 一般意义上的代理
            目前为止,我们可以这样来理解代理,A类想要做一件事,但是A类不会做,或不直接做,而是委托B类去做。A委托B,B是A的代理。

四、代理与协议的使用

我尽可能的用代码来进行描述,但首先需要进行一些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的代理,并对其进行操作来方便处理一些问题。以后找机会会陆续介绍。这篇文章就写到这里,谢谢。

后期UI篇还有很多代理的例子,尽请期待

OC第九节——协议与代理的更多相关文章

  1. iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

    本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类    1.2  如何在swift中实现oc的代理 ...

  2. 第九节: 利用RemoteScheduler实现Sheduler的远程控制 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案 第六节: 六类Calander处理六种不同的时间场景 第五节: Quartz.Net五大构件之Trigger的四大触发类 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联

    第九节: 利用RemoteScheduler实现Sheduler的远程控制   一. RemoteScheduler远程控制 1. 背景: 在A服务器上部署了一个Scheduler,我们想在B服务器上 ...

  3. C++模拟实现Objective-C协议和代理模式

    Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...

  4. 【转】fiddler-http协议调试代理工具

    题目有一些激进.但是在前端界打滚了这么多年,fiddler一直都是陪着我走过来了.它就是一个抓包神奇,代理神器.它的厉害之处,我简单地说一下,希望你们看了以后,能点上32个赞. 1.fiddler为何 ...

  5. HTTP协议 (五) 代理

    HTTP协议 (五) 代理 阅读目录 什么是代理服务器 Fiddler就是个典型的代理 代理作用一:FQ 代理作用二:匿名访问 代理作用三:通过代理上网 代理作用四:通过代理缓存,加快上网速度 代理作 ...

  6. JAVA 年轻代收集器 第九节

    JAVA 年轻代收集器  第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我 ...

  7. centos 文档的压缩和打包 gzip,bzip2,xz,zip,unzip,tar,tgz 第九节课

    centos  文档的压缩和打包   gzip,bzip2,xz,zip,unzip,tar,tgz  第九节课 SAS盘可以支持热插拔,看机器 tar.zip.tar -czvf 不会动源文件,gz ...

  8. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第九节

    原文链接 第九节:使用CUDA拓展高等级语言 Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的 ...

  9. 《C Prime Plus》第九节笔记

    第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...

随机推荐

  1. PTA fzu_oop_east

    GitHub链接: 传送门 5-1该日是该年的第几天 定义一个日期类Date,内有数据成员年.月.日,另有成员函数:构造函数用于初始化数据成员,输出,闰年的判断. 编写主函数:创建日期对象,计算并输出 ...

  2. 11个强大的Visual Studio调试小技巧

    简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...

  3. IOS基础之 (设计模式)

    一 工厂方法 工厂方法方便我们快速创建类的实例的方法.通过工厂方法,可以让调用过程更加清晰. Person.h #import <Foundation/Foundation.h> @int ...

  4. NOIp Graph 1002 瞎眼记

    又是虚脱的一天啊QAQ,早上习惯性迟到,九点多到学校开始码题,六道题看下来花了将近一个小时,主要纠结于第二题和第六题.到了十点,没再深入思考,开始码题.. 一直到十一点半,写了两道题.然后吃完饭后中午 ...

  5. css中关于居中的那点事儿

    css中关于居中的那点事儿 关于居中,无论是水平居中,还是垂直居中都有很多方式,下面我来介绍一些常用的. 第一部分:水平居中 1.实现行内元素的居中.方法:在行内元素外面的块元素的样式中添加:text ...

  6. JavaWeb---总结(六)Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  7. EasyUi 方法传递多个参数值得方法

    1.项目中需要传递多个参数值 function actionFtt(value, row, index) { //传递查询需要的参数 var customerId = row.customerId;/ ...

  8. Ubuntu 14.04 LTS 更新源大全

    Ubuntu 14.04 LTS 系统更新源汇总 如何使用这些系统更新源?---三步走 首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources. ...

  9. mysql优化--触发器和auto_increment

    1.触发器: 触发器的好处:做数据回收站或者做数据关联删除 触发器的坏处:给数据库增加压力,增删改变慢,不利与mysql移到其他数据库会出问题. 触发器建立:只能增删改,查不能建立. 例子1:创建一个 ...

  10. PageBase

    namespace Webform.App { public class PageBase : System.Web.UI.Page { } public interface IService< ...