一、理解协议与代理



协议:

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

代理:



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

二.协议的关键词

@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-6 帮助类

    视图帮助类 HtmlHelper HtmlHelper给我们封装了大量的常用方法,使我们的开发更具高效.那么其中有哪里是我们常用的呢? BingForm 生成form表单 上图简单的使用了Html.B ...

  2. HDU 4223 Dynamic Programming?(最小连续子序列和的绝对值O(NlogN))

    传送门 Description Dynamic Programming, short for DP, is the favorite of iSea. It is a method for solvi ...

  3. HTML5学习总结-03 地理定位

    一 地理定位 HTML5 Geolocation(地理定位)用于定位用户的位置. 1 地理定位 地理位置 经度  :   南北极的连接线 纬度  :   东西连接的线 位置信息从何而来: IP地址 G ...

  4. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

  5. 从Paxos到ZooKeeper-四、ZooKeeper技术内幕

    本文将从系统模型.序列化与协议.客户端工作原理.会话.服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕. 一.系统模型 1.1 数据模型 ZooKeeper的视图结构使用了其特有的& ...

  6. 遍历jsonobject

    遍历jsonobject 1 entrySet.iterator生成迭代器 2 从迭代器获取Map.Entry的单元对象 3 获取key和value Map<String,JSONObject& ...

  7. yum提示another app is currently holding the yum lock;waiting for it to exit

    Another app 解决方法:rm -rf /var/run/yum.pid 来强行解除锁定,然后你的yum就可以运行了

  8. curl 或 file_get_contents 获取需要授权页面的方法

    原文:http://blog.csdn.net/fdipzone/article/details/44475801 红色字体部分是加上自己的注释,整理了一下. 今天因工作需要,需要用 curl / f ...

  9. Autofac.Integration.Owin

    public static IAppBuilder UseAutofacMiddleware(this IAppBuilder app, ILifetimeScope container) { if ...

  10. Lua 之string库

    标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 string.rep(s, n) 返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如 )) -- ...