没有根的野草,漂浮的命途

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 的。

posted on 2012-04-23 14:21  针尖上的舞者  阅读(341)  评论(0)    收藏  举报