题目-协议
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
WorkerProtocol.h
Boss.h
Boss.m
Worker.h
Worker.m
main.m
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; }
相关文章推荐
- iOS开发——多线程篇——GCD
- find the safest road
- fatal: could not read Username for 'https://github.com': No such file or directo
- hdu1162 Eddy's picture 并查集+最小生成树
- IOS-笔记5 (swift和OC,View大小和位置)
- ubuntu下mysql安装(server、client、dev),开启、停止和重启,及常见错误
- Oracle 基本操作
- 网络请求数据
- 今天开始进入.net的学习中
- socket之广播
- (一二三)基于GCD的dispatch_once实现单例设计
- HEALTHY LIFE OPENCART 自适应主题模板 ABC-0133
- 解析数据与网络请求
- 树莓派使用MJPG-Streamer
- C#接口详解
- (一二三)基于GCD的dispatch_once实现单例设计
- 查看Nginx、apache、MySQL和PHP的编译参数
- poj 3253 Fence Repair(优先队列)
- Node.js静态文件服务器实战(接触nodejs开发中比较实用的部分技巧,获益匪浅)
- HEALTHY LIFE OPENCART 自适应主题模板 ABC-0133