详解Objective-C中分类和协议操作
Objective-C中分类和协议操作是本文要介绍的内容,主要从Objective-C的分类、协议、合成对象等内容,详细的讲述了本文内容,不多说,我们先来看详细内容。
一、分类
提供了一种简单的方式,用它可以将类的定义模块化到相关方法的组成分类中。提供了扩展现有类定义的简便方式,并不必访问的源代码,也无需创建子类。
类分类的一些注意事项:
(1)尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量,添加子类。
(2)分类可以重载给类中的另一个方法(认为此做法拙劣)。
(3)和一般接口不同,不必实现分类中的所有方法。
(4)对象/分类命名必须是唯一的。
二、协议
协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,由其他人来实现。协议提供一种方式来使用指定的名称定义一组多少有点相关的方法。
定义协议:使用@protocol指令,之后为协议名称,然后和处理接口部分一样声明一些方法。以@end结束。如:
@protocol NSCopying -(id)copyWithZone:(NSZone *)zone; @end
通过在@interface行的一对尖括号(<……>)内列出协议名称,可以告知编译器正采用一个协议。这项协议的名称放在类名和它的分类名称之后。如:
@interface AddressBook:NSObject <NSCopying>
如果类中有多项协议,只需把它们都列在尖括号中,用逗号分开。如:
@interface AddressBook:NSObject <NSCopying,NSCoding>
一个类遵循一个协议,其子类也遵守该协议。
如果希望继承你的类的用户实现一些方法,则可以使用协议定义这些方法。如:
@protocol Drawing -(void) paint; -(void) erase; @optional -(void) outline; @end
协议不引用任何类,它是无类的。
可以使用conformsToProtocol:方法检查一个对象是否遵循某项协议。如:
id currentObject; …… if([currentObject conformsToProtocol:@protocol(Drawing)]==YES) {……} id <Drawing> currentObject;
currentObject将包含遵守Drawing协议对象。"<>"中可加入多项协议,用逗号隔开。
定义一项协议可以扩展现有协议的定义。如:
@protocol Drawing3D <Drawing>
分类也可以采用一项协议。如:
@interface Faction (Staff) <NSCoping,NSCoding>
非正式协议实际上是一个分类。非正式协议通常是为根定义的。实际上是一个名称下的一组方法,可以将它们实现为协议的一部分。声明非正式协议的类并不实现这些方法,并且选择实现这些方法的子类需要在它的接口部分重新声明这些方法,同时还要实现这些方法中的一个或多个。如果一个对象采用正式协议,那么它则必须遵守协议中的所有信息。如果一个对象采用非正式协议,那么它可能不需要采用此协议的所有方法,具体取决于这项协议。
三、合成对象
另一项涉及和定义一个包含其他类的一个或多个对象的技术。如: