iOS基础---Protocol

系列文章目录

iOS基础—Block
iOS基础—Protocol
iOS基础—KVC vs KVO
iOS网络—AFNetworking
iOS网络—NSURLSession
iOS内存管理—MRC vs ARC
iOS基础—Category vs Extension
iOS基础—多线程:GCD、NSThread、NSOperation
iOS基础—常用三方库:Masonry、SDWebImage
iOS基础—定时器:GCD、NSTimer、CADisplayLink


文章目录


  • 在现实世界中,处理特定情况时,人们在公务上通常需要遵循严格的程序。例如,执法官员在进行询问或收集证据时需要“遵循规定程序”。
  • 在面向对象的编程世界中,能够定义在给定情况下对象所期望的一组行为非常重要。以一个表视图为例,它希望能够与数据源对象进行通信,以了解需要显示的内容。这意味着数据源必须响应表视图可能发送的一组特定消息。
  • 数据源可以是任何一个类的实例,例如视图控制器(在OS X上是NSViewController的子类,在iOS上是UIViewController)或者仅仅继承自NSObject的专用数据源类。为了让表视图知道哪个对象适合作为数据源,能够声明该对象实现了必要的方法是很重要的。
  • Objective-C允许你定义协议,它声明了在特定情况下要使用的方法。本章描述了定义正式协议的语法,并解释了如何将类接口标记为符合协议,这意味着该类必须实现所需的方法。

一个类接口声明了与该类相关联的方法和属性。相比之下,协议用于声明与任何特定类无关的方法和属性。定义协议的基本语法如下所示:

@protocol ProtocolName
// list of methods and properties
@end

作为示例,考虑一个用于显示饼图的自定义视图类,如下图所示:
在这里插入图片描述

为了使视图尽可能可重复使用,有关信息的所有决策都应留给另一个对象,即数据源。这意味着同一视图类的多个实例只需与不同的源进行通信即可显示不同的信息。饼图视图所需的最少信息包括段数、每个段的相对大小以及每个段的标题。因此,饼图的数据源协议可能如下所示:

@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
@end

饼图视图类接口需要一个属性来跟踪数据源对象。此对象可以是任何类,因此基本属性类型将是id。关于该对象唯一已知的是它符合相关协议。声明视图的数据源属性的语法如下:

@interface XYZPieChartView : UIView
@property (weak) id <XYZPieChartViewDataSource> dataSource;
...
@end

默认情况下,协议中声明的所有方法都是必需方法。这意味着任何符合该协议的类都必须实现这些方法。协议中还可以指定可选方法。这些方法是类仅在需要时才可以实现的方法。例如,可以使用@optional将协议方法标记为可选:

@protocol XYZPieChartViewDataSource
- (NSUInteger)numberOfSegments;
- (CGFloat)sizeOfSegmentAtIndex:(NSUInteger)segmentIndex;
@optional
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segmentIndex;
@end

就像 Objective-C 类可以从超类继承一样,您也可以指定一个协议符合另一个协议。最佳做法是定义协议以符合NSObject协议:

@protocol MyProtocol <NSObject>
...
@end

表示类采用协议的语法再次使用尖括号,如下所示:

@interface MyClass : NSObject <MyProtocol>
...
@end

Protocol 和继承区别

  • 继承之后默认就有实现,而protocol只要声明没有实现
  • 相同类型的类可以使用继承,但是不同类型的类只能使用protocol
  • protocol可以用于存储方法声明,可以将多个类中共有的方法抽取出来,以后让这些类遵守协议即可

Protocol 和category区别

  • Category给一个类可以扩充方法,既有声明也有实现,而Protocol只有声明,没有实现
  • Category和Protocol都可以声明方法,不能声明属性(Protocol可以用@property形式声明属性,只不过在Protocol中声明的属性,只有对应的setter/getter方法声明,并没有生成对应的成员变量)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值