协议
OC中,协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划由其他人来实现(程序员)。例如Foundation框架中,你会发现一些已定义的协议,其中一个名为NSCopying,而且它声明了一个方法,如果你的类要支持使用copy方法来复制对象,则必须实现这个方法。
协议提供了一种方式,用指定的名称定义一组多少有点相关的方法。这些方法通常有文档说明,所以你可以知道它们将如何执行。因此,如果需要,可以在自己的类定义中实现它们。
我觉得OC的协议,跟Java的接口(interface)很相似。都是列出一系列相关的方法,由需要使用它的类去实现里面的方法,类就具有了类似的功能。
OC的协议列出了一组方法,有些可以是选择实现,有些事必须实现。如果决定实现特定协议中所有方法,也就意味着要遵守或者采用这项协议。可以定义协议中得所有方法都是必须实现的,也可以都是选择实现的。
协议的定义:定义一个协议很简单,只要使用@protocol指令,后面跟上协议名。然后和处理接口部分一样,声明一些方法,最后用@end结束。
例如 Foundation框架的头文件NSObject.h中定义的NSCopying协议:
@protocol NSCopying - (id)copyWithZone:(NSZone* )zone @end
协议的实现:如果你要采用NSCopying协议,则必须实现copyWithZone:方法。通过在@interface行的一对尖括号内列出协议名称,可以告知编译器你正在采用一个协议。协议放在类名和它的父类名称之后。
@interface AddressBook: NSObject <NSCopying> ...... @end
如果要采用多项协议,只需把它们都列在尖括号内,用逗号隔开
@interface AddressBook: NSObject <NSCopying, NSCoding>
如果一个类遵守了一项协议,则它的子类也遵守这项协议。
协议定义可选方法:协议默认定义的方法是必须实现的,如果要定义可选方法,需要使用@optional指令,该指令之后列出的所有方法都是可选的。
@protocol Drawing - (void) print; - (void) erase; @optional - (void) outline; @end
采用Drawing协议不一定需要遵守outline方法,但一定要遵守print和erase方法。
定义协议时,可以扩展现有协议的定义,类似类的继承。
@protocol Drawing3D <Drawing>
代理
协议也是一种两个类之间的接口定义。定义了协议的类可以看作是将协议定义的方法代理给力实现它们的类。这样,类的定义可以更为通用,因为具体的动作由代理类来承担。
原文:http://www.cnblogs.com/zhangguiguang/p/4874816.html