一、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(协议)的更多相关文章

  1. OC语言的Block与Protocol(协议)

    Block ● Block封装了一段代码,可以在任何时候执⾏行 ● Block可以作为函数参数或者函数的返回值,⽽而其本⾝身又可以带输⼊入参数或返回值. ● 苹果官⽅方建议尽量多⽤用block.在多线 ...

  2. OC语言BLOCK和协议

    OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似 ...

  3. 李洪强iOS开发之OC语言BLOCK和协议

    OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相 ...

  4. oc语言--BLOCK和协议

    一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2 ...

  5. OC语法10——@protocol协议,

    参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...

  6. OC语言(六)

    四十六.block类型 用来封装代码,可以在任何时候执行. 与函数的区别:可以在运行时动态产生. block的标志:^ 有形参.有返回值 int (^sumblock)(int,int) = ^(in ...

  7. 浅析OC语言

    学习一门开发语言,首先要掌握的它的基本语法,这可能几天就能学会,但如果要融会贯通,就得去学习这门语言的框架和一些库,再结合一些项目的应用,这可能需要花几年的时间. OC是C语言的一个超集,是一门面向对 ...

  8. 黑马程序员——OC语言 其他语法

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特 ...

  9. ISO 基础之 (十三) protocol 协议

    一 简绍 protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现.这种模式一般称为代理(delegation)模式.通过Protocol定义各种行为,在不同的场景采 ...

随机推荐

  1. 答:我们公司的ASP.NET 笔试题,你觉得难度如何

    闲来无事,逛逛园子,发现有个面试题,觉得有意思.已自己的理解答来看看,不足之处,请多指教. 原文地址:http://www.cnblogs.com/leotsai/p/aspnet-tests-for ...

  2. Spark添加/更改集群节点需要修改的配置文件

    笔记:在配置好了spark后,如果需要添加/删除一个结点需要修改如下配置文件 cd $HADOOP/etc/hadoop 进入hadoop配置文件夹下 修改 slaves,将对应的节点添加/删除 修改 ...

  3. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  4. bzoj1004 Cards

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  5. 在FMX中实现PostMessage的方法

    在FMX中实现PostMessage的方法 http://www.qdac.cc/?p=1090 2014-10-31 • Android.C++ Builder.Delphi.杂谈 • 4条评论 • ...

  6. 《Programming WPF》翻译 第8章 6.我们进行到哪里了?

    原文:<Programming WPF>翻译 第8章 6.我们进行到哪里了? 动画可以增强应用程序的交互感.它有利于更平滑的转换--当条目出现或消失的时候.它应该,当然,被用于体验和重新着 ...

  7. 自定义JsonResult处理JSON序列化DateTime类型数据(Ext4.2+ASP.NET MVC 4)

    最近项目中前台页面使用Extjs4.2 ,在后台ASP.NET MVC4返回的DateTime类型的数据错返回的DateTime类型的JsonResult的结果中的值是“\/Date(13784461 ...

  8. linux下添加中文输入法

    一.安装环境 查看linux版本号 [ztteng@ztteng ~]$ lsb_release -aLSB Version:    :core-4.0-ia32:core-4.0-noarch:gr ...

  9. 【转】PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

    相对于linux来说,udev还是一个新事物.然而,尽管它03年才出现,尽管它很低调(J),但它无疑已经成为linux下不可或缺的组件了.udev是什么?它是如何实现的?最近研究Linux设备管理时, ...

  10. Linux 文件系统同步

    同步就是将物理内存中dirty的页写入到磁盘中,保证磁盘和物理页之间的内容一致. 触发同步操作的时机: 1.周期性内核线程,扫描脏页,根据一定的规则选择脏页,将页写回到磁盘. 2.如果内核中的脏页过多 ...