【Objective-C学习笔记】协议protocol
2015-04-13 02:22
399 查看
一、基本使用
1、协议的定义
@protocol 协议名称 <NSObject> // 方法声明列表 @end
#import <Foundation/Foundation.h> // 定义了一个名叫MyProtocol的协议 @protocol MyProtocol <NSObject> // @required 要求实现,不实现就会发出警告 // @optional 不要求实现 - (void)test; @required - (void)test2; - (void)test3; @optional - (void)test4; @end
(1)只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
(2)只要父类遵守了某个协议,就相当于子类也遵守了
(3)基协议
1>NSObject,它是一个基协议,最根本最基本的协议
2> NSObject协议中声明很多最基本的方法,比如description、retain、release等
3> 建议每个新的协议都要遵守NSObject协议
2、如何遵守协议
(1)一个类遵守协议
@interface 类名 : 父类名 <协议名称1,协议名称2> @end
<pre name="code" class="plain">@interface Person : NSObject <MyProtocol> @end
(2)协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
#import <Foundation/Foundation.h> #import "MyProtocol.h" // 一个协议遵守了某一份协议,就能拥有另一个协议的所有方法声明 @protocol MyProtocol3 <MyProtocol> - (void)hehe; @end
3、协议中方法声明的关键字
协议中有2个关键字可以控制方法是否要实现,在大多数情况下,用途在于程序员之间的交流(1)@required (默认)
要求实现,如果没有实现,会发出警告(2)@optional
不要求实现,怎么也不会有警告4、定义变量时指定协议
<pre name="code" class="plain">类名<协议名称> *变量名; NSObject<MyProtocol> *obj; id<协议名称> 变量名; id<MyProtocol> obj;
// Person对象遵守MyProtocol协议 NSObject<MyProtocol> *obj = [[Person alloc] init];如果没有遵守对应的协议,编译器会警告
5、@property中声明的属性也可以做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名; @property (nonatomic, strong) id<协议名称> 属性名; @property (nonatomic, strong) Dog<MyProtocol> *dog; @property (nonatomic, strong) id<MyProtocol> dog2;
6、协议使用规范
(1)如果这个协议只用在某个类中,应该把协议定义在该类中(2)如果这个协议用在很多类中,就应该定义在单独文件中
二、代理模式设计
1、设计原理
有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做,比如买票,人没有时间去买,交给代理去买。2、设计原则
(1)首先得拥有某个代理对象属性(2)其次要很清楚代理有哪些方法
(3)最后要保证能解耦
3、实现方案
// 场景:人没有时间去买票,叫代理对象去帮自己去买票(询问一下票价、询问一下剩余票数)
// TicketDelegate.h协议文件 #import <Foundation/Foundation.h> // 声明一些跑腿方法 @protocol TicketDelegate <NSObject> // 返回票价 - (double)ticketPrice; // 还剩多少张票 - (int)leftticketsNumber; @end
// Person.h文件 #import <Foundation/Foundation.h> #import "TicketDelegate.h" // 人 类的声明 @interface Person : NSObject // 买电影票 - (void)buyTicket; // 拥有一个代理属性, 代理的类名随便,必须遵守TicketDelegate协议 @property (nonatomic, strong) id<TicketDelegate> delegate; @end
// Person.m文件 #import "Person.h" // 人 类的实现 @implementation Person // 买电影票 - (void)buyTicket { // 叫代理去帮自己去买票(询问一下票价、询问一下剩余票数) double price = [_delegate ticketPrice]; int number = [_delegate leftticketsNumber]; NSLog(@"通过代理的帮忙,票价=%f,还剩下%d张票", price, number); } @end
// Agent.h文件 // 负责询问电影票情况的 代理1 #import <Foundation/Foundation.h> #import "TicketDelegate.h" // 遵守协议 @interface Agent : NSObject <TicketDelegate> @end
// Agent.m文件 #import "Agent.h" @implementation Agent // 每一张票多少钱 - (double)ticketPrice { // ... 亲自跑电影院or打电话 return 130; } // 剩余的票数 - (int)leftticketsNumber { // ... 亲自跑电影院or打电话 return 3; } @end
// NextAgent.h文件 // 负责询问电影票情况的 代理2 #import <Foundation/Foundation.h> #import "TicketDelegate.h" // 遵守协议 @interface NextAgent : NSObject <TicketDelegate> @end
// NextAgent.m文件 #import "NextAgent.h" @implementation NextAgent // 每一张票多少钱 - (double)ticketPrice { return 100; } // 剩余的票数 - (int)leftticketsNumber { return 5; } @end
// main.m #import <Foundation/Foundation.h> #import "Person.h" #import "Agent.h" #import "NextAgent.h" int main() { Person *p = [[Person alloc] init]; Agent *a = [[Agent alloc] init]; // 设置人的代理 p.delegate = a; // 人买票 [p buyTicket]; return 0; }
// 结果 通过代理的帮忙,票价=130.000000,还剩下1张票
NextAgent *a = [[NextAgent alloc] init]; // 设置人的新代理 p.delegate = a; // 人买票 [p buyTicket];
// 结果 通过代理的帮忙,票价=100.000000,还剩下5票
相关文章推荐
- 【初学】Objective-C学习笔记-委托代理(delegate)和协议(protocol)
- Object-C学习笔记-Protocol(协议)与非正式协议
- 【IOS 开发学习总结-OC-20】★★★objective-c面向对象——协议(protocol)
- Objective-C学习笔记第十三章协议
- ios学习笔记(二)之Objective-C类、继承、类别和协议 - superlucky
- 【Swift学习笔记】——enumeration枚举类型遵循协议protocol
- IOS学习笔记--Objective-C之协议、代码块、分类
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- 黑马——Objective-C学习笔记<十>:分类和协议
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之11-分类和协议——黑马 IOS 技术博客
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- objective-C学习笔记(十)协议
- ios学习笔记(二)之Objective-C类、继承、类别和协议
- Objective-C学习之旅(七)----协议protocol
- Objective-C学习笔记之协议和代理
- 学习笔记(objective-c)-协议(proto 4000 col)
- Objective-C学习笔记类目、协议
- Objective-C 学习笔记7 复制 NSCopying 协议
- 【Swift学习笔记00】——enumeration枚举类型遵循协议protocol