使用委托:
可以看成是一个类中声明了一个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:组合对象
一个类的对象可以由其他类对象组成,这也是一种扩展类的手段(除了继承和类扩展以外)。