黑马程序员——OC协议和代理

Objective-C协议详解
本文介绍了Objective-C中的协议概念,包括其定义、实现及与Java接口的对比。详细讲解了如何定义协议及其方法,并展示了如何在类中采用这些协议。

协议

OC中,协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划由其他人来实现(程序员)。例如Foundation框架中,你会发现一些已定义的协议,其中一个名为NSCopying,而且它声明了一个方法,如果你的类要支持使用copy方法来复制对象,则必须实现这个方法。

协议提供了一种方式,用指定的名称定义一组多少有点相关的方法。这些方法通常有文档说明,所以你可以知道它们将如何执行。因此,如果需要,可以在自己的类定义中实现它们。

我觉得OC的协议,跟Java的接口(interface)很相似。都是列出一系列相关的方法,由需要使用它的类去实现里面的方法,类就具有了类似的功能。

OC的协议列出了一组方法,有些可以是选择实现,有些事必须实现。如果决定实现特定协议中所有方法,也就意味着要遵守或者采用这项协议。可以定义协议中得所有方法都是必须实现的,也可以都是选择实现的。

 

协议的定义:定义一个协议很简单,只要使用@protocol指令,后面跟上协议名。然后和处理接口部分一样,声明一些方法,最后用@end结束。

例如 Foundation框架的头文件NSObject.h中定义的NSCopying协议:

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

 协议的实现:如果你要采用NSCopying协议,则必须实现copyWithZone:方法。通过在@interface行的一对尖括号内列出协议名称,可以告知编译器你正在采用一个协议。协议放在类名和它的父类名称之后。

@interface AddressBook: NSObject <NSCopying>
......
@end

 

如果要采用多项协议,只需把它们都列在尖括号内,用逗号隔开

@interface AddressBook: NSObject <NSCopying, NSCoding>

如果一个类遵守了一项协议,则它的子类也遵守这项协议。

 

协议定义可选方法:协议默认定义的方法是必须实现的,如果要定义可选方法,需要使用@optional指令,该指令之后列出的所有方法都是可选的。

@protocol Drawing
- (void) print;
- (void) erase;
@optional
- (void) outline;
@end

 采用Drawing协议不一定需要遵守outline方法,但一定要遵守print和erase方法。

定义协议时,可以扩展现有协议的定义,类似类的继承。

@protocol Drawing3D <Drawing>

 

 

代理 

 协议也是一种两个类之间的接口定义。定义了协议的类可以看作是将协议定义的方法代理给力实现它们的类。这样,类的定义可以更为通用,因为具体的动作由代理类来承担。

 

转载于:https://www.cnblogs.com/zhangguiguang/p/4874816.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值