一、理解协议与代理



协议:

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

代理:



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

二.协议的关键词

@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. class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class

    今天在工作中遇到了下面的问题: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springfram ...

  2. C/C++ 程序的build过程

    (This article is under constant construction) DISCLAIMER: 本文的主要内容来自https://gcc.gnu.org/onlinedocs/gc ...

  3. CentOS 7.0 安装配置LAMP服务器方法(Apache+PHP+MariaDB)

    一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: #停止firewall服务 sys ...

  4. Apache 优雅重启 Xampp开机自启 - 【环境变量】用DOS命令在任意目录下启动服务

    D:\xampp\apache\bin\httpd.exe" -k runservice Apache 优雅重启 :httpd -k graceful Xampp开机自启动  参考文献:ht ...

  5. Beta Daily Scrum 第三天

    [目录] 1.任务进度 2.困难及解决 3.燃尽图 4.代码check-in 5.总结 1. 任务进度 学号 今日完成 明日完成 612 初步完成成就界面的统计图表 继续编写成就界面的图表 615 白 ...

  6. 我所了解的meta

    https://github.com/hoosin/mobile-web-favorites 总况 meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name). h ...

  7. django_restframework_angularjs

    用Django Rest Framework和AngularJS开始你的项目 作者:Kevin Stone原帖:Getting Started with Django Rest Framework a ...

  8. glade2支持C++代码的输出(1)

    开发了一个基类,用于支持GTK2的信号回调 见BaseObject.zip 为了便于快速通过glade设计界面,并生成相应的C++代码,我对glade-2 2.12.2的代码进行了修改 原始代码:gl ...

  9. EasyUI-Datagrid 中formatter和group-formatter的使用

    1.在表格属性设置函数那块写以下内容: groupFormatter:function(value,rows){ //这里可以看到每一条导入表格中的数据,可以返回group的总结值 }, column ...

  10. javascript字符串截取的substring、substr和slice

    本文详细的介绍了javascript中substring().substr()和slice()三个JS字符串截取的方法,substring()方法用于提取字符串中介于两个指定下标之间的字符.subst ...