您的位置:首页 > 其它

题目-协议

2015-08-17 21:04 351 查看
协议概念

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: