由于最近才刚刚学习ios,所以最近在项目的闲暇时间,学习了下协议的内容。
协议的定义
协议也可以理解为规则或约定,个人觉得有点类似于java的函数式接口,也就是java的interface的呢。
协议的特点
- 协议没有父类,并且不能定义成员变量
- 协议中可以定义很多方法,但是可以不需要全部把他们进行实现,这一点有点不像java的函数式接口,java强制需要进行复写的呢。
- 协议是多个类共享的一个方法列表,协议中列出方法没有相应的实现,如果一个类采用名为MyProtocol的协议,就必须实现MyProtocol协议内的@required(必须的)标识的方法。协议用@optional标识的方法可选实现!
协议的使用方法:
协议的使用
功能介绍:首先介绍了一下,这个程序主要实现了一个计时器的功能,然后进行协议的拆分
## 协议的声明 ##
//协议定义
@protocol UpdateAlertDelegate <NSObject>
@optional // 可选方法标志
//更新协议的内容
-(void)updateAlert:(NSTimer *)timer;
@end
@interface TimerControl : NSObject
//遵循协议的一个代理变量定义
@property (nonatomic,weak) id <UpdateAlertDelegate>delegate;
-(void)startTheTimer;
@end
//初步定义
@protocol 协议名 <对象>
-(对象类型) 方法名:(参数类型)参数名
@end
注意:
1.数据源属性和代理属性一般需要使用 weak 来标示属性,原因在于避免循环引用
2.有些同学可能有些疑问协议方法是不是必须实现?答案是对的,但是如果有@optional 可以进行选择,但是@required必须是要重写的。
那么协议的定义实现了,是不是应该查看协议的实现了呢?ok,上代码。
## 协议的实现 ##
#import "TimerControl.h"
@implementation TimerControl
NSTimer *timer=nil;
-(void)startTheTimer
{
timer =[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerPro) userInfo:nil repeats:true];
NSLog(@"%@",timer);
// 如果不添加下面这条语句,在UITableView拖动的时候,会阻塞定时器的调用
//[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
}
-(void)timerPro{
[self.delegate updateAlert:timer];//该句就是实现代理中的方法
NSLog(@"%@",timer);
}
@end
方法调用
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIButton *click;
@property (strong, nonatomic) IBOutlet UILabel *showInfo;
@end
@implementation ViewController
int secondsCountDown=60; //倒计时总时长
NSTimer *countDownTimer;
- (void)viewDidLoad {
[super viewDidLoad];
self.showInfo.text=[NSString stringWithFormat:@"%d",secondsCountDown];;
[self.click addTarget:self action:@selector(initTimer) forControlEvents:UIControlEventTouchDown];
}
-(void)initTimer
{
TimerControl *timer =[[TimerControl alloc]init];
timer.delegate =self;
[timer startTheTimer];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)updateAlert:(NSTimer *) timer{
//倒计时-1
secondsCountDown--;
//修改倒计时标签现实内容
NSLog(@"%d",secondsCountDown);
self.showInfo.text=[NSString stringWithFormat:@"%d",secondsCountDown];
//当倒计时到0时,做需要的操作,比如验证码过期不能提交
if(secondsCountDown==0){
[timer invalidate];
}
}
@end
主要是点击一个按钮,进行倒计时显示功能。
协议的继承
就像其它Objective-C类可以继承一样,协议也有类似的机制,我们可以使得一个协议遵循另一个协议。
如果一个协议遵循另一个协议,类似与继承机制,你就需要在协议中提供遵循的协议的方法,一般的,我们在iOS里写协议都回遵循NSObject协议。不过由于一般我们都是使用NSObject的子类,所以我们不需要提供NSObject协议方法的实现,对于遵循协议的形式,示例如下:
@protocol MyProtocol <NSObject>
...
@end
在上例中,任何遵循了MyProtocol的协议也会自动的遵循NSObject里面声明的方法
协议的多重继承机制
一个类的实例如果遵循了相应的协议的话,那它就不仅仅是实现它本身在头文件里声明的方法了,他还要实现协议里声明的方法,当然,他不需要在自己的头文件里再次声明,只需要实现就可以了。
当然,有时候我们觉得一个协议太少了,这个时候是不是会考虑用多个协议呢?iOS里面我们可以通过逗号吧多个协议隔开,来实现同时遵循多个协议,示例代码如下:
@interface MyClass : NSObject <timer, timer2,
timer3>
...
@end
谢谢大家,日后会有继续更新我的学习进度