oc语言--protocol(协议)

时间:2021-04-20 09:35:16

一、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——&commat;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 基础之 &lpar;十三&rpar; protocol 协议

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

随机推荐

  1. sweetalert api中文开发文档和手册

    官网和下载地址: http://t4t5.github.io/sweetalert/  2016年10月30日14:10:21 废话,目前php开发越来越API话,所以php方法很多都是json返回数 ...

  2. 性能tips

    Latch 闩 锁的平级 采样时间不能太长,太频繁 一般情况下,性能图应该是一种趋势图,看的是趋势,不看某些单个点 在压测收集数据时,可能多种工具收集到的性能数据有少许差异,原因: 网络延迟,导致收集 ...

  3. day12 函数对象,名称空间与作用域

    """ 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...

  4. 省选前的CF题

    RT,即将退役的人懒得一篇篇写题解,于是有了这个东西 CF1004E 树上选一条不超过k个点的链,最小化其余点到链上点的最大距离 这个思路很有意思,不像平时一般的树上问题,是从叶子开始一点点贪心合并直 ...

  5. winform 异性窗体的实现

    效果图 首先需要在vs里添加控件  AlphaForm.dll 添加完了有这来两个控件 1.把第二个控件拖入窗体里把窗体铺满 2.找一张至少有一个闭合图形的透明图片 设置为AlphaFormTrans ...

  6. python列表(list)遍历

    list = ['html', 'js', 'css', 'python'] 遍历列表方法1:for i in list: print("序号:%s 值:%s" % (list.i ...

  7. c&num;代码阅读

    问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4 ...

  8. HDU 3085 Nightmare Ⅱ(双向BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 题目大意:给你一张n*m地图上,上面有有 ‘. ’:路 ‘X':墙 ’Z':鬼,每秒移动2步,可 ...

  9. &lbrack;BZOJ4898&rsqb; &lbrack;Apio2017&rsqb;商旅

    [BZOJ4898] [Apio2017]商旅 传送门 试题分析 考虑两个点之间的路径,显然如果交易的话肯定选\(S_{t,i}-B_{s,i}\)最大的. 那么我们可以先用\(Cost\)把两个点的 ...

  10. first application

    <!DOCTYPE html> <html> <head> <title>Create a Map</title> <meta htt ...