题目-协议

协议概念

Protocol(协议)

(一)简介

1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明

3.只要父类遵守了某个协议,那么子类也遵守

4.Protocol声明的方法可以让任何类去实现,protocol就是协议

5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)

6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。

7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。

 

(二)基本使用

1.协议的定义

@protocol 协议名称 <NSObject>

方法声明列表

@end;

2.如何遵守协议

(1)类遵守协议

@protocol 类名:父类名 <协议名称1,协议名称2>

@end

(2)协议遵守协议

@protocol 协议名称 <其他协议名称>

@end;

3.协议方法声明中的关键字

(1)required (默认)要求实现,若没有实现则警告但不报错

(2)Optional 不要求实现

4.定义变量时遵守协议的限制

类名<协议名称> *变量名    NSObject<.Myprotocol> *obj;

Id  <协议名称>  变量名   id  <.Myprotocol> obj1;

 

5.Property中声明的属性也可以做遵守协议的限制

@property (nonatomic ,strong ) 类名<协议名称> *属性名;

@property (nonatomic ,strong ) id<协议名称>  属性名;

 

6.补充知识:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。

BossProtocol.h

#import <Foundation/Foundation.h>
//1.创建协议
@protocol BossProtocol <NSObject>
//默认为必须实现
- (NSInteger)buyWood;
//必须实现
//@required
//- (void)test1;
//- (void)test2;
//可选实现
@optional
- (void)test3;
@end

WorkerProtocol.h

#import <Foundation/Foundation.h>

@protocol WorkerProtocol <NSObject>
- (void)salary;
@end

Boss.h

#import <Foundation/Foundation.h>
#import "BossProtocol.h"
#import "WorkerProtocol.h"
@interface Boss : NSObject<WorkerProtocol>

//拥有委托权
//必须用weak
@property (nonatomic, weak) id<BossProtocol> delegate;


- (void)wantWood;
- (void)test;
@end

Boss.m

#import "Boss.h"

@implementation Boss
{
    NSTimer *_myTimer;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        /*
         第一个参数:时间间隔
         第二个参数:实现位置
         第三个参数:调用的方法
         第四个参数:携带参数
         第五个参数:是否可以重复
         
         */
        _myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(wantWood) userInfo:nil repeats:YES];
    }
    return self;
}

- (void)wantWood
{
    //判断是否交出委托权并且代理者是否实现协议中的buyWood方法
    if (_delegate && [_delegate respondsToSelector:@selector(buyWood)]) {
        NSInteger n = [_delegate buyWood];
        if (n >= 100) {
            //判断定时器是否在运行
            if ([_myTimer isValid]) {
                //停止并删除定时器
                [_myTimer invalidate];
                _myTimer = nil;
            }
            CFRunLoopStop(CFRunLoopGetCurrent());
        }
    }
}

- (void)salary
{
    NSLog(@"表现很好,工资5000,奖金1000");
}

- (void)test
{
    NSLog(@"test");
}
@end

Worker.h

#import <Foundation/Foundation.h>
#import "BossProtocol.h"
#import "WorkerProtocol.h"
//2.遵循协议<>
@interface Worker : NSObject<BossProtocol>
@property (nonatomic, weak) id<WorkerProtocol>delegate;
@end

Worker.m

#import "Worker.h"

@implementation Worker
{
    NSInteger _progress;
}
- (instancetype)init
{
    self = [super init];
    if (self) {
        _progress = 0;
    }
    return self;
}
//实现协议
- (NSInteger)buyWood
{
    
    _progress += 10;
    NSLog(@"当前进度为%zi",_progress);
    if (_progress >= 100) {
        [self getMoney];
    }
    return _progress;
}

- (void)getMoney
{
    if (_delegate && [_delegate respondsToSelector:@selector(salary)]) {
         [_delegate salary];
    }
   
    
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"
/*
 代理模式的实现步骤:
 1. 创建协议文件,定义协议
 2. 代理对象遵循协议
 3. 指定代理对象
 4. 通过代理调用方法
 */
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Boss *boss = [[Boss alloc]init];
         Worker *worker = [[Worker alloc]init];
        //3.boss指定代理对象worker
        //一对一
        boss.delegate = worker;
        worker.delegate = boss;
        //boss提出需求
        //4.通过代理调用方法
//        [boss wantWood];
      
//        [[NSRunLoop mainRunLoop] run];
        CFRunLoopRun();
        
        
    }
    return 0;
}

 

posted @ 2015-08-17 21:04  ios-C  阅读(174)  评论(0编辑  收藏  举报