一、理解协议与代理



协议:

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

代理:



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

二.协议的关键词

@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. MVC5-10 ModleBinder那点事

    模型绑定器 之前或多或少也提到过模型绑定器,方法的形参就是由模型绑定器把参数绑定上去的,今天就说说ModuleBingder那点事 在MVC中有一个接口叫IModuleBinder // // 摘要: ...

  2. centos7安装mplayer 错误集锦

    (1)在 linux下运行程序时,发现了error while loading shared libraries这种错误,一时间不知道解决办法,在网上搜索,终于解决了:./tests: error w ...

  3. 【Alpha版本】冲刺-Day4

    队伍:606notconnected 会议时间:11月12日 会议总结 张斯巍(433) 今天安排:图片查看界面设计 完成度:40% 明天计划:设置界面设计 遇到的问题:校运会比赛时间不够 感想:因为 ...

  4. 基于UDP协议的程序设计

    使用UdpClient类进行编程 UdpClient类的使用方法 第一阶段 创建UdpClient实例 UdpClient udpClient = new UdpClient(); IPAddress ...

  5. 云计算之KVM简介(一)

    云计算之KVM简介(一) 因为很多人会将云计算和虚拟化弄混,我下面为大家介绍一下 云计算指的是资源使用和交互的一种模式 虚拟化指的是技术,可以将物理计算机虚拟成多个逻辑计算机(VMware)  他俩是 ...

  6. 2015年10月份经常使用的linux命令。

    ps -ef |grep  服务名         详细的介绍可以参考此篇博客http://www.cnblogs.com/wangkangluo1/archive/2011/09/23/218593 ...

  7. SPOJ:ABCDEF

    传送门 废话不说,这道题暴力枚举是$O(N^6)$,显然无法承受. 推导一下 $(x_1*x_2+x_3)/x_4-x_5=x_6$ $x_1*x_2+x_3=x_4*(x_5+x_6)$ 等式左边和 ...

  8. 通过rsync搭建一个远程备份系统(一)

    前言 我公司是电子商务公司,全部是linux系统,每天的网站数都在增加,为了保证安全,需要建立一个远程容灾系统,将网站数据每天凌晨1点备份到远程服务器上,由于数据量大,每天进行进行增量备份,仅仅备份当 ...

  9. POJ2635The Embarrassed Cryptographer(大数取余+素数筛选+好题)

    题目链接 题意:K是由两个素数乘积,如果最小的素数小于L,输出BAD最小的素数,否则输出GOOD 分析 素数打表将 L 大点的素数打出来,一定要比L大,然后就开始枚举,只需K对 素数 取余 看看是否为 ...

  10. 通过System.getProperties()获取系统参数

    Properties props=System.getProperties(); //系统属性    System.out.println("Java的运行环境版本:"+props ...