IOS-协议的理解和倒计时demo

由于最近才刚刚学习ios,所以最近在项目的闲暇时间,学习了下协议的内容。

协议的定义

协议也可以理解为规则或约定,个人觉得有点类似于java的函数式接口,也就是java的interface的呢。
协议的关系

协议的特点

  1. 协议没有父类,并且不能定义成员变量
  2. 协议中可以定义很多方法,但是可以不需要全部把他们进行实现,这一点有点不像java的函数式接口,java强制需要进行复写的呢。
  3. 协议是多个类共享的一个方法列表,协议中列出方法没有相应的实现,如果一个类采用名为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

谢谢大家,日后会有继续更新我的学习进度

借鉴:http://www.tuicool.com/articles/iemIbq

githup地址:https://github.com/Catheryan/demoDelegate2/

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页