关于OC中的委托delegate

使用委托:

可以看成是一个类中声明了一个protocol,另外一个类作为委托来实现这个protocol内的方法。

比如当在iPhone中创建一个表时,需要使用UITableView类。但是这个类不知道表的标题,也不知道有多少的部分或行需要显示,也不知道表中每行或每个单元格中应该显示什么内容。所以它将这一系列的工作委托给你,利用定义的一个协议:UITableViewDateSource。当他需要显示信息时,就调用适当的协议方法。

UITableView类中还定义了一个UITableViewDelegate协议,这个协议内的方法指示诸如当选中一行时应该出现的动作,它将这个动作的决定权委托给用户。

1、Informal Protocols:非正式协议

它实际上是一个具名类扩展(Category),只声明了一个方法列表,但没有实现这些方法,故也称为通用扩展(Informal Category),有时它还被称为抽象协议(abstract protocols,和CPP中抽象类作接口类似)。

任何人都要继承相同的根类,比如NSObject等。故一般在根类中定义通用扩展(Informal Category).

  • 来看如下代码,NSObject类中的NSComparisonMethods扩展:
1 @interface NSObject (NSComparisonMethods)
2 - (BOOL) isEqualTo: (id) object;
3 - (BOOL) isLessThanOrEqualTo: (id) object;
4 ...
5 @end

(以下将formal protocol译为专用协议,将informal protocol译为通用协议,以示区分)

一个通用协议(通用扩展)仅仅是一个扩展名下面包含的一些列方法名称,这样对于方法的归档和模块化而言是有利的。

声明通用协议的类并不实现它里面的方法,而这个类的子类若想实现通用协议中的方法,则必须重新再在这个子类的接口中进行方法声明。

与专用协议(普通的protocol)不同,编译器并不能对通用协议排错,如对协议的接受性检查或进行协议测试等。

若有类对象接受某专用协议,它必须接受这个协议的所有required消息,无论是在编译还是运行时,消息可用性都能得到保证。

但如果一个对象接受某通用协议,这个对象并不需要接受协议中的所有消息,而是以协议本身来定。消息可用性在运行时才得到执行,但在编译时并不能被保证。

(在OC2.0中@optional指令是为了取代informal protocol而加入的,在UIKit类中已经有一些应用。)

2、Composite Objects:组合对象

一个类的对象可以由其他类对象组成,这也是一种扩展类的手段(除了继承和类扩展以外)。

时间: 2024-10-14 21:56:21

关于OC中的委托delegate的相关文章

C#中的委托(Delegate)和事件(Event)

C#中的委托(Delegate)和事件(Event) 2007-11-30 11:40:00 分类: 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考. 委托和事件应该是C#相较于C++等之前的非托管的语言提出的一个新的术语(term).“旧瓶装新酒”这样的描述似乎有些“贬义”,但确实是这样.委托也好,事件也好最初的起源是C/C++中的函数指针,关于函数指针的简单介绍可以参见我以前的一篇<C/C++中指向函数的

C#中的委托 Delegate

1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx 2. 委托 就相对与 一类方法 (即方法类,或者方法接口) 而这一类方法都具有相同的 修饰符.形参以及 返回值类型 2.1. 委托 既是方法: 声明委托的方式如下:在修饰符后加上 delegate ['d?l?ɡ?t]关键字 public delegate void Del(string

Objective-C中的委托(代理)模式

我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口回调,其实就是实现的委托代理模式.简单的说代理就是把相应的功能交给实现接口的相应的类中来解决.在OC中没有接口该如何实现代理呢?前面的博客中笔者说提了一句,在OC中的协议和Java中的接口极为相似,都是只声明方法而不去实现,方法的实现在OC中交个遵循协议的类,而在Java中方法的实现交给实现接口的类

[程序示例]Objective-C中的委托设计模式(牛仔与姑娘)

今天整理电脑翻到以前自学Objective-C时写的一个练习委托设计模式的一个小程序,就po上来和大家分享,顺便自己也复习一下OC中的委托. Objective-C中的委托设计模式是和协议分不开的. 协议呢,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现.(在Objective-C2.0中可以在协议里选择是否必须实现某种方法,用关键字@optional和@required) 委托的话,顾名思义就是自己处理不了的事情,委托他人按照协议里写好的条款来办理这件事. 具体实现

OC中APPDelegate[[UIApplication shareApplication]delegate]]Swift实现

直接上代码: var myDelegate:AppDelegate? myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate OC中APPDelegate[[UIApplication shareApplication]delegate]]Swift实现

.Net: C#中的委托(Delegate)和事件(Event)

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事 件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. P1:什么是委托?事件是委托吗? 答:委托可以把一个方法

ios中关于delegate(委托)的使用心得

从开始从事OC工作到现在大概1年多了,从当初接触oc的"协议"的不明白,到现在代码中随处可见的委托,协议,其中感悟颇多. 首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事.也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法. 其次,我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件. 1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理.(切分紧耦合,和代码分块的

智能指针 与 oc中的指针

智能指针 与 oc中的指针 智能指针的原理及实现 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副

C# 中的委托和事件

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委 托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续) 引言 委托 和 事件在