黑马程序员——protocol(协议)的概念及其使用

来源:互联网 发布:mac照片如何归类 编辑:程序博客网 时间:2024/04/30 07:51

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


第一讲   协议的基本使用


概念:

       在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。
这个里面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

作用:

拱其他的类去遵守,如果一个类的遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法,方法有两种:必须实现和选择实现


protocol的使用流程:
协议的使用流程:
定义协议----> 在类中采用指定的协议---->实现协议中的方法(注意方法有必须实现和选择实现两种)
如图:

协议的定义

@protocol协议名称<NSObject> //默认遵守NSObject协议

//方法声明列表
@end;
注意:
协议默认的要采纳NSObject的协议

//Run.h#import <Foundation/Foundation.h>@protocolRun <NSObject>-(void)eat;-(void)run;@end//Work.h#import <Foundation/Foundation.h>@protocolWork <NSObject>-(void)myWork;@end


采纳协议
(1)类遵守协议
创建类的时候遵守某个或者某几个协议
@interface 类名 : 父类 <协议名称>
@end
@interface 类名 : 父类 <协议名称1,协议名称2>
@end


某个协议也遵守某个或者某些协议,一个协议可以遵守其他多个协议,
(1)协议遵守协议
@protocol协议名称<其他协议名称>
@end
(2)多个协议之间用逗号 , 隔开。
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end

//(1)类遵守协议//某个类遵守某个协议@interface 类名 : 父类 <协议名称>@end//引入要采纳的协议#import "Run.h"//采纳协议@interfacePerson : NSObject<Run>@end//某个协议遵守某个或者某些协议,一个协议可以遵守其他多个协议,//多个协议之间用逗号 , 隔开。@protocol 协议名称 <协议名称1,协议名称2>@end//引入要采纳的协议#import "Run.h"#import "Work.h"//采纳协议@interfacePerson : NSObject<Run,Work>@end//(2)协议遵守协议@protocol协议名称<其他协议名称>@end;

实现协议的方法

如果一个类遵守了某个协议
则只需要在这个类的实现(.m)文件中,实现协议的方法就可以了

Person.h#import "Person.h"@implementationPerson-(void)run{NSLog(@"人会跑");}-(void)eat{NSLog(@"人开始吃东西");}-(void)myWork{NSLog(@"人要工作");}@end

使用注意

1)protocol就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明

3)只要父类遵守了某个协议,那么子类也遵守

4)protocol声明的方法可以让任何类去实现,protocol就是协议

5)OC不能继承多个类(单继承)但能遵守多个协议

6)基协议:<NSObject>是基协议,是最根本的协议,期中生命了很多最基本的方法

7)协议可以遵守协议,一个协议最受了另一个协议,就可以拥有另一份协议中的方法声明

第二讲   protocol中@required和@optional

@required和@optional是协议方法声明中的两个关键字
他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,
用途在于程序员之间的交流
@public
@protected
@private
@package
@required:这个方法必须要实现(若不实现,编译器会发出警告)

@protocolRunProtocol <NSObject>//@required表示必须要实现的方法@required-(void)run;//可以选择实现的方法@optional-(void)eat;@end

第三讲    protocol类型限制
设定情景:
某逗比程序员A 希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。
满足条件的女生都可以向他发送消息
从题目中我们得到要求:
1)会做饭
2)会洗衣服
3)有份好工作

得到协议如下:
houseHold.h@protocolhouseHold <NSObject>-(void)zuoFan;-(void)xiyifu;@optional-(void)job;@end

1)使用id存储对象时,对象的类型限制
格式:id <协议名称> 变量名
如:id <Myprotocol>obj1;
//这样写以后,表示只要是个人都满足条件,不满足题意
idgirlFriend = [[Personalloc] init];
//下面写法表示,赋值给girlFriend的对象必须采纳了houseHold协议
//如果不满足,则给出警告
id<houseHold> girlFriend = [[Personalloc] init];

如果修改Person,让Person 采纳houseHold协议,则此时不会报错了
#import <Foundation/Foundation.h>#import "houseHold.h"@interfacePerson : NSObject<houseHold>@end
2)对象赋值时类型限制
使用类也同样如此
格式:类名<协议名称>*变量名
NSObject<Myprotocol>*obj;
3)对象关联关系下,对象的类型限制
设定情景:
某屌丝程序员B 想养一只会算术的狗。
从题目中我们得到要求:
1)人拥有一条狗
2)狗必须会算算术
//dogProtocol.h#import <Foundation/Foundation.h>@protocoldogProtocol <NSObject>//进行求余运算-(void)mod;@end//person.h#import <Foundation/Foundation.h>#import "houseHold.h"#import "Dog.h"#import "dogProtocol.h"@interfacePerson : NSObject<houseHold>@property(nonatomic,strong) Dog<dogProtocol> *dog;@end
此时再随便给一条狗,则不能满足要求了
//修改Dog.h文件#import <Foundation/Foundation.h>#import "dogProtocol.h"@interfaceDog : NSObject<dogProtocol>@end

id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处, 能精确地限制返回值的具体类型

第四讲  protocol代理设计模式

概念:
         代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人。传入的对象,代替当前类完成了某个功能,称为代理模式
      
 利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量 4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值        

protocol代理模式应用场合:

代理设计模式的场合:
* 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
* 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
* 当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)
1)监听器的场合
* Teacher想监听Baby的一些行为
2)通知的场合
* Baby发生了一些行为,想告知Teacher
3)有些事情,不想自己处理,想交给别人处理
* Baby发生了一些行为, 但是自己不会处理, 可以交给Teacher处理




0 0
原创粉丝点击