第十三章协议


一、正式协议
正式协议是一个命名的方法列表(与非正式协议一样)
正式协议显示地要求采取协议(与非正式协议不一样),采取协议的办法是在@interface声明中列出协议的名称
采取协议意味着承诺实现协议的所有方法
(正式协议与Java的接口一样)

1、声明协议
以Cocoa的NSCopying协议为例子,采用这个协议意味着你的对象将知道如何复制自己

@protocol NSCopying

-(id)copyWithZone:(NSZone *)zone;

@end

@protocol告诉编译器:下面将是一个新的正式协议,@protocol之后是协议名称,且协议名称唯一
然后是一个方法声明列表,协议的每个采用者都必须实现这些方法,协议声明以@end结束
使用协议不引入新的实例变量

2、采用协议

@interface Car : NSObject <NSCopying,NSCoding>

{

         //实例变量

}

//方法

@end//Car

采用某个协议,可以在类的声明中列出该协议的名称,并用尖括号将协议名称括起来

3、实现协议

二、复制copy
如果你是用alloc、copy或new方法获得一个对象,则该对象的保留计数器的值为1,并且你要负责释放他、

copy方法可以复制对象,copy消息通知对象创建一个全新的对象,并使新对象与接收copy消息的原对象一样

浅层复制Shallow Copy,不复制引用对象,新复制的对象只指向现有的引用对象

深层复制Deep Copy,复制所有的引用对象

 举例代码:采用NSCopying的接口

@interface Engine : NSObject <NSCopying>

@end//Car

实现协议的方法

-(id)copyWithZone:(NSZone *) zone

{

         Engine *engineCopy;

         engineCopy = [[[self class] alloWithZone:zone] init];

         return (engineCopy);

}//copyWithZone

copyWithZone方法的首要任务是获得self对象所属的类,所以要先执行self class,通过self class可以创建出最准确的类对象(无论是父类还是子类)
返回self的类后调用allocWithZone方法在内存中创建一个该类的新对象
最后调用init初始化

协议和数据类型
一个用尖括号括起来的协议名称跟随在id之后,则编译器将指导你期望任意类型的对象,只要其遵守该协议
举例代码:某类中有一个方法,要求该方法的对象参数遵守NSCopying协议
-(void)setObjectValue:(id<NSCopying>)obj;

三、Objective-C 2.0的新特性
O-C 2.0中增加了2个新的协议修饰符:@optional 和@required
从字面就可以看出来@optional修饰的方法为可选择实现的方法
                  @required修饰的方法为必须实现的方法
Cocoa中的非正式协议逐渐被@optional修饰的正式协议所替代
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值