Chapter 9 : 分类和协议
1. 协议(protocol) : 其声明类于类接口的声明,不同的是,协议没有父类,且不能定义成员变量。
2. 协议(protocol)声明如下:
1 @protocol MyProtocol 2 3 - (void)myProtocolMethod; 4 5 @end
-> 协议(protocol)是多个类共享的一个方法列表(Methods List), 协议(protocol)中列出的方法没有相应的实现。如果一个类采用MyProtocol协议,则必须实现名为myProtocolMethod的方法。
3. 协议(protocol)的使用: 通过在@interface行的一对尖括号<...>内列出协议(protocol)名称,可以告知编译器你正在采用一个协议(protocol)。这项协议名称放在类名和它的父类名称之后,如下:
1 @interface AddressBook : NSObject <myProtocol>
此代码说明:AddressBook是NSObject的子类,并遵守myProtocol协议。在AddressBook的实现部分,编译器期望找到定义的myProtocolMethod方法。
使用多项协议,只需要将它们列在尖括号中:
1 @interface AddressBook : NSObject <myProtocol, yourProtocol>
4. 协议(protocol)注意事项:
-> 如果一个类遵守某项协议(protocol), 那么它的子类也遵守该协议(protocol)。
-> 协议(protocol)不引用任何类,它是无类的(classless)。任何类都可以遵守某项协议。
-> 通过在类名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性,如下:
1 id <Drawing> currentObject;
这将告知编译器currentObject将包含遵守Drawing协议的对象,如果向currentObject指派静态类型的对象,这个对象不遵守Drawing协议,编译器将给出warning。
注意:如果向currentObject指派一个id变量,则不会产生warning,因为编译器不知道存储在id变量中的对象是否遵守Drawing协议。
-> 如果变量保存的对象遵守多项协议,也可列出多项协议,如下:
1 id <Drawing, Drawing1> currentObject;
-> 定义一项协议旱,可以扩展现有协议的定义,如下:
1 @protocol Drawing3D <Drawing>
说明Drawing3D协议也采用了Drawing协议。因此采用Drawing3D协议的类都必须实现此协议列出的方法以及Drawing协议的方法。
-> 分类(Category)中也可采用协议, 如下:
1 @interface Fraction (stuff) <NSCopying, NSCoding>
此处,Fraction拥有一个分类stuff, 这个分类(Category)采用了NSCopying和NSCoding协议。