使用委托:

可以看成是一个类中声明了一个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:组合对象

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