委托模式从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. 数据结构——Currency System in Geraldion

    题目: Description A magic island Geraldion, where Gerald lives, has its own currency system. It uses b ...

  2. bzoj 1055 [HAOI2008]玩具取名(区间DP)

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1258  Solved: 729[Submit][Statu ...

  3. MD5加密详解

    MD5加密详解 引言: 我在百度百科上查找到了关于MD5的介绍,我从中摘要一些重要信息: Message Digest Algorithm MD5(中文名为信息摘要算法第五版)为计算机安全领域广泛使用 ...

  4. SRM 597

    我果然是题短了就能做得好- -.Div 2的三道题都短,于是迅速的过掉了250和500,rating涨了150^ ^. Div 2 250pt 题意:给一个vector<int> A,对其 ...

  5. bind()

    首先是改变this指向问题 var altwrite = document.write; altwrite("hello"); 上面的程序运行,会报错:Uncaught TypeE ...

  6. Spring配置多个数据源

    Spring 配置多数据源实现数据库读写分离 博客分类: Spring 数据库   现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Mast ...

  7. CentOS 搭建 FastDFS-5.0.5集群

    转http://www.open-open.com/lib/view/open1435468300700.html 第一步,确定目标: Tracker  192.168.224.20:22122  C ...

  8. 谈"http get和post的区别"

    --以下内容如有各种问题,烦请指出,谢谢各位^_^-- 最基本的Java程序员面试题都有这个题 --http get和post的区别? 不少人大学还没毕业就知道,就算不知道也会去搜,我记得我快毕业那会 ...

  9. C# 解析js方法,并调用js方法

    本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html 本文不是基于B/S的 后台调用前台js方法,而是给你一段js ...

  10. visul svn+花生壳

    1.服务器端 工具:visul svn+花生壳 花色壳:注册域名 visul svn:配置http://www.cnblogs.com/bluewelkin/p/3479105.html 外网访问,端 ...