委托模式从GoF装饰模式、适配器模式和模板方法等演变过来,几乎每一个应用都会或多或少的用到委托模式。

在古希腊有一个哲学家,他毕生只做三件事情:“睡觉”、“吃饭”、和“工作”。为了更好的生活,提高工作效率,他会找一个徒弟,把这些事情委托给他弟弟做。然而要成为他得徒弟,需要实现一个协议,协议要求能够实现“睡觉”、“吃饭”、“工作”的问题。三者的关系如下。

从图中可以看到,通用类(Philosopher)保持指向委托对象(ViewController)的“弱引用”

(id<PhilosopherDelegate> delegate),委托对象(ViewController)就是哲学家的“徒弟”,它实现了协议

PhilosopherDelegate。PhilosopherDelegate规定了3个方法:sleep、eat、work;

代码PhilosopherDelegate.h的代码如下

@protocol PhilosopherDelegate

@requied
- (void) sleep;
- (void) eat;
- (void) work; @end

可以看到PhilosopherDelegate定义了三个方法。如果改委托协议没有m文件。它的定义可以放在别的h文件中。他得实现委托类ViewController,相关代码如下:

//
// ViewController.h
// Philosopher
//
// Created by ChenHao on 10/30/14.
// Copyright (c) 2014 xxTeam. All rights reserved.
// #import <UIKit/UIKit.h>
#import "PhiosopherDelegate.h"
#import "Phiosopher.h"
@interface ViewController : UIViewController<PhiosopherDelegate> @end //
// ViewController.m
// Philosopher
//
// Created by ChenHao on 10/30/14.
// Copyright (c) 2014 xxTeam. All rights reserved.
// #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Phiosopher *obj=[[Phiosopher alloc] init];
obj.delegate=self;
[obj start];
} -(void)sleep
{
NSLog(@"sleep");
}
-(void)eat
{
NSLog(@"eat");
}
-(void)work
{
NSLog(@"work");
} @end

  

委托对象如何于通用类建立引用关系呢?我们通过ViewController方法中得obj.delegate=self 语句来指定委托对象和通用类结构的引用关系。一半情况下,通用类由框架直接提供。在这个例子中,我们根据需要自己实现了通用类。

代码如下

//
// Phiosopher.h
// Philosopher
//
// Created by ChenHao on 10/30/14.
// Copyright (c) 2014 xxTeam. All rights reserved.
// #import <Foundation/Foundation.h>
#import "PhiosopherDelegate.h"
@interface Phiosopher : NSObject
{
NSTimer *timer;
int count;
} @property (nonatomic,weak) id<PhiosopherDelegate> delegate;
-(void)start;
-(void)handle;
@end

  

在上述代码中,我们定义了delegate属性,它的类型食id《PhiosopherDelegate》,他可以保存委托对象的引用,其中属性weak说明是弱引用,这里是弱引用是为了防止内存引用计数增加二导致委托对象无法释放的问题。

//
// Phiosopher.m
// Philosopher
//
// Created by ChenHao on 10/30/14.
// Copyright (c) 2014 xxTeam. All rights reserved.
// #import "Phiosopher.h" @implementation Phiosopher -(void)start
{
count=0;
timer=[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(handle) userInfo:nil repeats:YES];
} -(void)handle
{
switch (count) {
case 0:
[self.delegate sleep];
count++;
break;
case 1:
[self.delegate eat];
count++;
break;
case 2:
[self.delegate work];
[timer invalidate];
break; default:
break;
} } @end

  

IOS开发----委托机制的更多相关文章

  1. iOS开发-委托(Delegate)浅谈

    委托其实并不是OC中才有,C#中也有,不过彼此的理解方式是不一样的,OC中委托是协议的一种,需要使用@protocol声明,委托一般在iOS开发中页面中传值用的比较多.委托是Cocoa中最简单.最灵活 ...

  2. iOS开发ARC机制下的内存管理技术要点

    转载一篇: iOS开发ARC内存管理技术要点.ARC内存管理原则总结.iOS ARC内存管理总结 ARC内存管理机制 (一)ARC的判断准则: 只要没有任何一个强指针指向该对象,该对象就会被释放. ( ...

  3. IOS开发缓存机制之—本地缓存机制

    功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...

  4. iOS开发-委托实战

    昨天晚上头疼,写了一部分草草的收笔了,早上起来补发一篇文章,昨天关于委托的基本使用和概念都稍微讲了一下,最开始学习委托的时候苹果官网和中文的博客文章看了不少,相似指数比较高.委托在命名要准确,最好是一 ...

  5. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  6. iOS开发-消息通知机制(NSNotification和NSNotificationCenter)

    iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页 ...

  7. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  8. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  9. iOS开发——高级技术&签名机制

    签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...

随机推荐

  1. Python import / pyd / dll

    使用Python import 模块时, 先会在模块的搜索path里依次搜索(前面会覆盖之后出现的同名模块),次序为: 1. 程序的主目录(交互模式下当前的工作目录或 脚本文件所在的目录) 2. 环境 ...

  2. DFS序 参考许昊然《数据结构漫谈》

    网上特别讲DFS序的东西好像很少 太简单了? 实用性不大? 看了论文中 7个经典问题, 觉得挺有用的 原文 "所谓DFS序, 就是DFS整棵树依次访问到的结点组成的序列" &quo ...

  3. poj2393

    题目大意: 奶酪工厂 奶牛买了一个奶酪工厂制作全世界有名的Yucky酸奶,在接下来的N周(1<=N<=10000),牛奶的价格和工作将会受到波动例如他将花费C_i (1 <= C_i ...

  4. dos 命令

    DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd 运行 command删除文件 rd 文件名/S创建文件 MD 文件名 1. net user admi ...

  5. 一键安装lnmp脚本

    前段时间一直在找一个快速部署lnmp环境的方法,也没找着,就自己写了一个,结合网上的大神们的.我的方法是脚本结合源码包,很多依赖裤都是yum安装的,这都在脚本里面,需要的源码包我都下载好了,打包成压缩 ...

  6. PHP学习之[第05讲]PHP5.4 循环结构、系统函数和自定义函数

    一.while/for/break/continue: while (expr){ statements } for (expr1:expr2:expr3){ statement } break n  ...

  7. iOS中@class #import #include 简介

    [转载自:http://blog.csdn.net/chengwuli125/article/details/9705315] 一.解析        很多刚开始学习iOS开发的同学可能在看别人的代码 ...

  8. paip.输入法编程----删除双字词简拼

    paip.输入法编程----删除双字词简拼 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/at ...

  9. Linux基本配置和管理 2 ---- Linux多命令协作----管道及重定向

    1 管道和重定向 1 在Linux中大多数命令都很简单,很少出现复杂的命令,每个命令只是实现一个简单的功能,我们可以通过组合不同的命令来实现复杂的功能 2 在Linux中几乎所有的命令返回的数据都是纯 ...

  10. LTTng调试: 一个系统软件工程师的随手涂鸦

    http://nanxiao.me/install-lttng/ http://packages.efficios.com/ http://lttng.org/ http://lttng.org/do ...