IOS开发----委托机制
委托模式从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开发----委托机制的更多相关文章
- iOS开发-委托(Delegate)浅谈
委托其实并不是OC中才有,C#中也有,不过彼此的理解方式是不一样的,OC中委托是协议的一种,需要使用@protocol声明,委托一般在iOS开发中页面中传值用的比较多.委托是Cocoa中最简单.最灵活 ...
- iOS开发ARC机制下的内存管理技术要点
转载一篇: iOS开发ARC内存管理技术要点.ARC内存管理原则总结.iOS ARC内存管理总结 ARC内存管理机制 (一)ARC的判断准则: 只要没有任何一个强指针指向该对象,该对象就会被释放. ( ...
- IOS开发缓存机制之—本地缓存机制
功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...
- iOS开发-委托实战
昨天晚上头疼,写了一部分草草的收笔了,早上起来补发一篇文章,昨天关于委托的基本使用和概念都稍微讲了一下,最开始学习委托的时候苹果官网和中文的博客文章看了不少,相似指数比较高.委托在命名要准确,最好是一 ...
- iOS开发-代理模式
代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...
- iOS开发-消息通知机制(NSNotification和NSNotificationCenter)
iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页 ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- iOS开发——高级技术&签名机制
签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...
随机推荐
- 【转】 Linux/Unix 进程间通信的各种方式及其比较
http://blog.csdn.net/guopengzhang/article/details/5528260 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问 ...
- 十大纺织品、布料、面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp.com
十大纺织品.布料.面料品牌排名 - 十大品牌 - 中国品牌网 Chinapp.com 十大纺织品.布料.面料品牌排名
- Spring和MyBatis实现数据的读写分离
移步: http://blog.csdn.net/he90227/article/details/51248200
- Hard 不用+号实现两个数之和 @CareerCup
例子: 759+674 1)不考虑进位: 323 2)只考虑进位:1110 3)两者之和:1433 递归求解c package Hard; /** * Write a function that ...
- Android ExpandableListView实例Demo
前几篇文章介绍了Listview.但在实际开发中也常常会用到多层的Listview来展示数据,比方qq中的好友展示,所以这张来了解一下ExpandableListview.基本思想与Listview大 ...
- android中Canvas使用drawBitmap绘制图片
1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置 drawBitmap(Bitmap bitmap, float left, float ...
- iOS开发系列之触摸事件
基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...
- linux (ubuntu) 下设置 tomcat 随系统自动启动
网上说的有很多, 我只记录一种 1. 切换到 /etc/init.d/ 目录下 2. sudo vim tomcat 3. 在打开的文件里写入以下内容 #!/bin/sh # chkconfig: # ...
- 转载:C#中&与&&的区别
原文地址:http://www.cnblogs.com/chinafine/archive/2009/02/17/1392309.html 感谢博主分享! 二元运算符 (&) 为整型和 b ...
- jquery.placeholder.js的使用
最近做东西用到placeholder这个属性,可是这个属性在低版本的IE或者QQ浏览器等这些浏览器上这个属性不能生效,后来在网上查了下,发现了jquery的一个插件jquery.placeholder ...