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定义各种行为,在不同的场景采 ...
随机推荐
- Http GET、Post方式的请求总结
读取http响应信息,并返回响应体 /// <summary> /// 读取http响应信息,并返回响应体 /// </summary> /// <param name= ...
- centos 源码安装git
(1) 添加rpmforge源 wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686 ...
- Verilog 模块参数重定义(转)
Verilog重载模块参数: 当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数语法:d ...
- 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- AnimateWindow
WINDOWS提供了一个很有意思的函数:AnimateWindow.之前我想实现像MSN,QQ这些收到邮件的时候动画方式,从地下升上来的显示一个窗口,感觉很麻烦,自己去写代码,效果很不理想,今天无意中 ...
- JSP 中 JSTL 页面标签的笔记
jsp头部引入使用的标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%&g ...
- SVN版本分支合并
SVN,开发中常用的工具,也没什么可说的.这里只是记录一下,以免太久不用了想用的时候又忘了. 首先已经有两个目录,一个是分支目录SVNChild,一个是主干目录SVNMain.SVNChild是从SV ...
- TCP和UDP的区别(转)
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- Pure Css 菜单的使用
本人新手,之前偶尔接触Bootstrap,也做过一些响应式开发,但是都是略显皮毛,公司的业务需求也限制了深入学习. 现着手Pure Css学习,尝试了简单的左边菜单自动隐藏的demo.闲话少说,代码贴 ...
- OLEDB简介
OLE DB(OLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口.OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQ ...