黑马程序员_OC中的协议学习

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------


在说到正式协议之前,还有一种叫做非正式协议。

非正式协议

非正式协议使用分类(category)来实现,非正式协议是NSObject的一个分类,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。

正式协议

与非正式协议一样,正式协议是包含了方法和属性的有名称列表。但与非正式协议不同的是,正式协议要显式地采用。采用协议地办法是在类地@interface声明中列出协议地名称。

声明协议

来看一下Cocoa声明地一个协议,NSCopying。如果你采用了NSCopying协议。你的对象就会知道如何创建自身地副本。

@protocol NSCopying
- (id) copyWithZone: (NSZone *) zone;
@end

@protocol后面是协议名称。协议名称必须是唯一的。

也可以继承父协议,与继承父类有些类似。在声明语句协议名称后面的尖括号内可以指定父协议的名称。

@protocol MySuperDuberProtocol <MyParentProtocol>
@end

第一行代码表示MySuperDuberProtocol协议继承于MyParentProtocol协议,因此你必须要实现两个协议中所需要实现的方法。

再来看一看例子。下面是Cocoa的NSCoding协议:

@protocol NSCoding
- (void) encodeWithCoder: (NSCoder *) encoder;
- (id) initWithCoder: (NSCoder *) decoder;
@end

当某个类采用NSCoding协议时,便意味着该类将实现这两个方法。encodeWithCoder:方法用于接受对象的实例变量并将其转换为NSCoder类的对象。initWithCoder:方法从NSCoder类的对象中提取经过转换的实例变量,并使用它们去初始化新的对象。这两个方法总是成对出现的。

采用协议

如果要采用某个协议,可以在类的声明中列出该协议的名称,并用尖括号括起来。例如,Car类要想采用NSCopying协议。则类的声明如下:

@interface Car : NSObject <NSCopying>
{
	// instance variables
}
// methods
@end

而如果Car类要采用NSCopying和NSCoding这两个协议。则声明如下:

@interface Car : NSObject <NSCopying, NSCoding>
{
	// instance variables
}
// methods
@end

接着就是实现协议了。将在下一篇博客进行学习使用。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值