Protocol and Delegate协议和代理
1.什么是协议?
OC协议仿照Java的接口。协议和接口,都是不同类的对象之间一种通信的机制。
2.协议的基础语法
单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他并不是一个文件所能展现出来的。协议是多文件之间的一种关系,写法不难,重要的是逻辑关系不混乱。
(1)书写协议,协议体内书写方法,遵从(conform)该协议的类,将会出卖这个方给协议的主人。
(2)协议的属性
这里书写的方法也有属性,协议的方法,默认为@required,意为必须,遵从协议的人必须有这个方法。
属性@option,遵从协议的对象,如果有这个方法就出卖这个方法,若没有就算了。
(3)协议的遵从
类遵从协议,只需要包含协议,并且在类声明的@interface最后加<protocol>即可,这里的<>里面是协议名。
(4)协议的主人
一个类拥有协议,需要包含这个协议,然后声明一个id<protocol>型的成员变量 ,就说明该类拥有protocol协议,是其主人。
协议有时不是为了扩大权利,反而是为了限制权利。使用协议,让遵从协议的对象,只拥有有限的方法。
3.协议的使用(代理和委托)
协议的使用,关乎多个文件,所以我们这里使用一个小程序来体会,协议的使用。
一家具厂老板需要一批木材,但是老板不懂采购。厂里的工人懂得采购木头,但是工人不需要采购。这时老板就需要委托工人去购买木头,工人作为老板的代理去采购。使用面向对象的思想,使用OC完成这个程序。
- //boss.h
- #import <Foundation/Foundation.h>
- #import "work.h"
- @interface Boss : NSObject
- {
- @private
- id <work> delegate; //id类型变量,表明代理为delegate ,该类为协议的拥有者
- }
- @property (retain)id <work> delegate;//强引用,不加retain为弱引用
- -(void)delegateBuyWood;
- @end
- // Boss.m
- #import "Boss.h"
- @implementation Boss
- @synthesize delegate;
- -(void)delegateBuyWood
- {
- [delegate BuyWood]; //协议主人不能直接调用协议中的函数,需要代理
- }
- -(void)dealloc
- {
- [delegate release];
- [super release];
- }
- @end
- // worker.h
- #import <Foundation/Foundation.h>
- #import "work.h"
- @interface worker : NSObject <work> //说明类遵循协议
- -(void)BuyWood;
- -(void)married;
- @end
- // worker.m
- #import "worker.h"
- @implementation worker
- -(void)BuyWood
- {
- NSLog(@"BuyWood!!!");
- }
- -(void)married
- {
- NSLog(@"Marry!!!");
- }
- @end
- // work.h
- #import <Foundation/Foundation.h>
- @protocol work <NSObject>
- -(void)BuyWood; //这是worker类出卖的方法,这样能够被主人调用
- @end
- // main.m
- #import <Foundation/Foundation.h>
- #import "Boss.h"
- #import "worker.h"
- int main (int argc, const char * argv[])
- {
- @autoreleasepool {
- Boss * jianjian = [[Boss alloc]init];
- worker * dandan = [[worker alloc]init];
- jianjian.delegate = dandan; //将worker对象设为boss的代理
- [jianjian delegateBuyWood]; //这样boss就能买木头了
- [jianjian release];
- [dandan release];
- }
- return 0;
- }
4.代理和回馈
上面的函数完成了我们初步的设计,但是我们会发现,如果要是boss类中的成员有木材总量的话,每次work购买木头,boss中的木材总量都会增加。解决这个问题的话,再添加一个代理,boss遵循这个协议,worker拥有这个协议,就能完成两个类之间的通讯。我们也可以叫这种方式叫做回馈。
当两个对象互为代理的时候,我们在设置代理的set函数时,需要将其中任意一个retain,另一个不retain。使用retain设置的对象set函数,我们称之对该对象的强引用,不使用retain设置的对象,称之为若引用。
5.函数的声明
凡是父类已经声明过的函数,子类重写时,不用再声明,而且不管子类是否声明,只要main文件里有父类的头文件,那么该函数就是公有的。
凡是出卖给协议的方法,可以只在协议里写声明,类里面不需要声明。只要main函数能找到该函数的一个声明,该函数就是公有的,称该函数对main可见。
本文出自 “CoderToDeveloper” 博客,请务必保留此出处http://rongchengfei.blog.51cto.com/6269699/1089601
Protocol and Delegate协议和代理的更多相关文章
- protocol 和delegate(协议和代理)的区别
定义 protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话): delegate:中文叫代理或委托, ...
- 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h ...
- iOS——protoco和delegate (事件代理)
一:被代理人personOne personOne.h #import <Foundation/Foundation.h> @protocol SomeThing<NSObject& ...
- iOS开发之protocol和delegate
protocol--协议 协议是用来定义对象的属性,行为和用于回调的. 协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...
- C++模拟实现Objective-C协议和代理模式
Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...
- OC第九节——协议与代理
一.理解协议与代理 协议: 协议就是需要相互遵守的约定.规范:需要去实现协议中规定的方法. 代理: 代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表).它更像是一种关系,我要 ...
- 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)
本文转载至 http://blog.csdn.net/learnios/article/details/8442201 分类: 功能模块2012-12-27 10:22 109人阅读 评论(0) 收 ...
- ARP(Address Resolution Protocol)地址解析协议初识
ARP址解析协议是根据IP地址获取物理地址的一个TCP/IP协议.它工作在OSI七层模型的中第二层——数据链路层. 使用ARP地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址 ...
- Socks协议以及代理转发工具分析
前言:最近两场HW都和某师傅学到了挺多东西,算是对内网不出网以及流量代理做个分析(SOCKS协议,reGeorg原理分析,frp的代理,CS上的代理 SOCKS SOCKS(Socks:Protoco ...
随机推荐
- Maven提高篇系列之(六)——编写自己的Plugin(本系列完)
这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...
- ASP.NET MVC ValueProvider小结
在Model绑定中,Model的数据来源有很多种,在MVC里面则定义了一套ValueProvider的组件来处理Model数据来源多样性的问题,ValueProvider整个结构类似于字典(Dictr ...
- iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)
iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...
- ASP.NET MVC 模块与组件(二)——定制图片验证码
本着简洁直接,我们就直奔主题吧! 下面是一个生成数字和字母随机组合的验证码类源代码: using System; using System.Drawing; using System.Drawing ...
- MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
文章内容 从上章文章都知道,asp.net是运行在HttpRuntime里的,但是从CLR如何进入HttpRuntime的,可能大家都不太清晰.本章节就是通过深入分析.Net4的源码来展示其中的重要步 ...
- C#中在AxWebBrowser控件注入JS脚本的方法
/// <summary> /// 窗体加载 /// </summary> private void JS_Load(object sender, EventArgs e) { ...
- div浮动在页面底部
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Tigase数据库结构(1)
Tigase数据库有很多张表,其中最主要的是3张表:tig_users,tig_nodes和tig_pairs. 1.tig_users tig_users存储用户信息,有uid(主键,用户ID),u ...
- ==与equals()
java中的比较有很多种 1.== 2.equals() 3.< 或 >或 != 4.instanceof 5.compareTo 1.什么时候用"==" 什么时候用& ...
- Fiddler 教程
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...