黑马程序员——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
某逗比程序员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];
//如果不满足,则给出警告
id<houseHold> girlFriend = [[Personalloc] init];
#import <Foundation/Foundation.h>#import "houseHold.h"@interfacePerson : NSObject<houseHold>@end2)对象赋值时类型限制
使用类也同样如此
格式:类名<协议名称>*变量名
NSObject<Myprotocol>*obj;
设定情景:
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的好处, 能精确地限制返回值的具体类型
1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量 4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值
* 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
* 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
* 当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)
1)监听器的场合
* Teacher想监听Baby的一些行为
2)通知的场合
* Baby发生了一些行为,想告知Teacher
3)有些事情,不想自己处理,想交给别人处理
* Baby发生了一些行为, 但是自己不会处理, 可以交给Teacher处理
- 黑马程序员——OC语言——protocol(协议)的概念及其使用
- 黑马程序员——protocol(协议)的概念及其使用
- 黑马程序员——block的概念及其基本使用
- 黑马程序员——OC语言的protocol协议
- 黑马程序员——OC学习之协议protocol的使用
- 黑马程序员——OC语言Protocol(协议)
- 黑马程序员——OC基础---protocol(协议)
- 【黑马程序员】protocol的概念及基本使用
- 黑马程序员--OC之@protocol的概念以及使用
- 黑马程序员 —— 标识符的概念及其命名规则
- 黑马程序员---Protocol协议
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- 黑马程序员——protocol简单使用
- 黑马程序员——IOS基础——Protocol协议
- 黑马程序员——OC—block和protocol协议
- 黑马程序员——OC语言中的协议protocol
- 黑马程序员——OC中的协议:protocol
- 黑马程序员--OC--Protocol(协议)
- 转轮检测机电机控制
- 一直用delphi做ERP软件,想换个语言,想做java,但是。。好纠结啊
- 【编程】超快速计算平方根的倒数
- 互联网神经学,建立互联网时代大脑计划的理论基础
- POJ3664---没使用结构体,用数组(未AC)
- 黑马程序员——protocol(协议)的概念及其使用
- ubuntu安装php-cgi
- 学习Python (三)
- ion-content中存在ion-list,在ion-list外固定其他控件位置不滚动
- 【经典算法】:二分查找
- web
- css
- DOM
- 二叉树首尾点的寻找