oc语言--protocol(协议)
一、protocol
1.基本用途
1> 可以用来声明很多方法,但是不能用来声明成员变量
2> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3> 只要父类遵守了某个协议,就相当于子类也遵守了
2.格式
1> 协议的编写
@protocol 协议名称
//方法声明列表
- (void)test;
- (void)test2;
+ (void)test;
+ (void)test2;
@end
2> 某个类遵守协议
@interface 类名 :父类 <协议名称>
@end
3> 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名> 变量名;
例如:NSObject<协议名1> *obj;//现在obj只能保存遵守协议名1的对象;如果没有遵守编译器会发出严重警告
4> @property中声明的属性也可用作一个遵守协议的限制
例如:@property (nonatomic,strong) 类名<协议名称> *属性名;
@property (nonatomic,strong) Dog<协议名> *dog;
3.关键字
协议中有两个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
1> @required:这个方法必须要实现(若不实现,编译器会发出警告)
2> @optional:这个方法不一定要实现
@protocol MyProtocol //声明协议
- (void)test;
+ (void)test;
@optional
- (void)test2;
+ (void)test2;
@end #import <Foundation.Foundation.h> @interface Person : NSObject <MyProtocol> //遵守协议
@end @implementation
- (void)test
{
//要求实现该方法
}
+ (void)test
{
//要求实现该方法
} - (void)test2
{
//可以不实现该方法
}
+ (void)test2
{
//可以不实现该方法
}
}
@end int main()
{
return ;
}
协议(例子)
4.协议遵守协议
1> 一个协议可以遵守其他多个协议,多个协议之间用逗号,隔开
2> 一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
3> 多协议格式
@protocol 协议名称 <协议1,协议2>
@end
5.基协议
1> NSObject是一个基类,最根本最基本的类,任何其它类最终都要继承他
2> NSObject也是一个协议,最根本最基本的协议
3> NSObject协议中声明了很多最基本的方法,例如description、retain、release等
4> 建议每个新协议都要遵守NSObject协议
6.注意点
协议可以定义在单独.h文件中,也可以定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
二、协议的应用--代理模式
1.设计原理
有些事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
2.设计原则
1> 首先要拥有某个代理对象属性
2> 其次要清楚代理有哪些方法
3> 最后要帮助能解耦
3.实现方案
1> 定义一个protocol,在其中声明一些和代理沟通的方法
2> 拥有一个代理属性 id<protocol>delegate
3> 让代理遵守protocol
#import <Foundation.Foundation.h> @property TicketDelegate <NSObjecct> // 设计协议
- (double)ticketPrice; // 票价
-(int)leftTicketNumber; // 剩余票数
@end @interface Person : NSobject @property id<TIcketDelegate> delegate; - (void)buyTicket; @end @implementation Person - (void)buyTicket
{
//自己没时间去买票,叫代理
double price = [_delegate ticketPrice];
int number = [_delegate leftTicketNumber];
NSLog("通过代理得知,票价=%d,剩余票数为%d", price ,number);
}
@end @interface Agent <TicketDelegate> //遵守协议
@end @implementation Agent : NSObject
- (double)ticketPrice
{
rerurn 100.0;
} -(int)leftTicketNumber
{
return ;
}
@end int main()
{
Person *p = [Person new]; //人
Agent *a = [Agent new]; // 代理 p.delegate = a; // 设置人的代理
[p buyTicket]; return ;
}
代理(例子)
三、自我总结
协议顾名思义就是双方达成的意愿。但是在计算机语言中,有其特有的含义。协议本身包含大量方法的声明,协议的最大用途,我现在的理解是可以实现两个毫无关系的类的沟通,即我们常说的代理模式,协议中有大量的方法声明,只要实现这些方法就可以实现相应的功能,当然前提是要遵守。这块内容很重要,一定要牢牢掌握。
oc语言--protocol(协议)的更多相关文章
- OC语言的Block与Protocol(协议)
Block ● Block封装了一段代码,可以在任何时候执⾏行 ● Block可以作为函数参数或者函数的返回值,⽽而其本⾝身又可以带输⼊入参数或返回值. ● 苹果官⽅方建议尽量多⽤用block.在多线 ...
- OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似 ...
- 李洪强iOS开发之OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相 ...
- oc语言--BLOCK和协议
一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2 ...
- OC语法10——@protocol协议,
参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...
- OC语言(六)
四十六.block类型 用来封装代码,可以在任何时候执行. 与函数的区别:可以在运行时动态产生. block的标志:^ 有形参.有返回值 int (^sumblock)(int,int) = ^(in ...
- 浅析OC语言
学习一门开发语言,首先要掌握的它的基本语法,这可能几天就能学会,但如果要融会贯通,就得去学习这门语言的框架和一些库,再结合一些项目的应用,这可能需要花几年的时间. OC是C语言的一个超集,是一门面向对 ...
- 黑马程序员——OC语言 其他语法
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特 ...
- ISO 基础之 (十三) protocol 协议
一 简绍 protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现.这种模式一般称为代理(delegation)模式.通过Protocol定义各种行为,在不同的场景采 ...
随机推荐
- PostgreSQL的时间函数使用整理
PG的时间函数使用整理如下 1.获取系统时间函数 select now(); --2012-05-12 18:51:59.562+08 select current_timestamp; --2012 ...
- Database JDBC Developer's Guide
http://docs.oracle.com/database/121/JJDBC/datacc.htm#JJDBC28363
- XJOI网上同步训练DAY1 T2
思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决 ...
- windows下删除Linux
在Windows下删除Linux系统的方法(附修复MBR的工具下载) 我的电脑安装了双系统,Windows和Linux,不过由于Linux在最近一段时间内不会使用,所以我打算删除Linux. 删除 ...
- poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题
题目链接 题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiC ...
- 【转】使用vnc连接linux服务器方便hadoop开发调试
VNC(Virtual Network Computing)它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上. 类似的软件在Windows服务器中包含的"Terminal Serve ...
- pyqt一个简单的动画
import sys from PyQt4.QtGui import QApplication , QGraphicsEllipseItem , QGraphicsItemAnimationfrom ...
- ios 计算文字的尺寸
/** * 计算文字尺寸 * @param text 需要计算尺寸的文字 * @param font 文字的字体 * @param maxSize 文字的最大尺寸 */ - (CGSize)sizeW ...
- LinqToXML~读XML文件续
上篇文章读了如何通过linq to xml去读取XML文件,而这讲主要通过linq to xml来读取由属性组件的XML文件,例如读取一个web.config的XML格式的配置文件,下面是config ...
- Dave(正方形能围成的最大点数)
Dave Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submis ...