objective-c NSCopying协议
正式的协议采用 protocol 关键字。声明协议的语法类似于声明类,但是要注意协议不能有成员变量,它相当于 Java 中的 interface。
例如:Cocoa 声明了一个协议---NSCopying:
@protocol NSCopying
- (id) copyWidthZone:(NSZone *) zone;
@end
要采纳某个协议,可以在类的声明中列出该协议的名称,并用尖括号将协议名称括起来,然后必须在 @implement 中实现协议中声明为 required(默认就是 required)的所有方法,而声明为 optional 的方法可以。
下面让类 MyObject 采纳 NSCopying 协议:
@interface MyObject : NSObject <NSCopying>
{
}
@end
@implementation MyObject
- (id) copyWithZone: (NSZone *) zone
{
MyObject *objectCopy;
objectCopy = [[[self class] allocWidthZone: zone] init];
return (objectCopy);
}
@end
说明:[self class] 返回的是对象所属的类。allocWidthZone 是一个类方法,因此在这里使用是合适的。
我们可以在实例变量和函数参数的数据类型中指定协议的名称,这样就可以约束该变量或参数必须满足的条件(即遵循声明的协议),编译器会对此约束条件进行检查。如:
-(void) setObjectValue:(id<NSCopying>) obj;
在这里 setObjectValue 要求传入的参数必须遵循 NSCopying 协议,即实现了 NSCopying 协议中声明的所有方法。
注意:Objective-C 只在2.0中才添加 required 和 optional 关键字,在这之前,所有的协议中所有的方法都是 required 的。
浙公网安备 33010602011771号