------<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;
@end1)使用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>
@endid和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处理
本文介绍了Objective-C中的Protocol概念,它类似Java的接口,用于声明一组方法,但可选实现。Protocol包含必须实现(@required)和可选实现(@optional)的方法,允许类遵守多个协议。遵守协议的类需要在实现文件中实现所需方法,协议还可遵守其他协议,扩展其方法声明。
的概念及其使用&spm=1001.2101.3001.5002&articleId=49986691&d=1&t=3&u=5c254454d07b46e7a2a01bc976b31ebd)
386

被折叠的 条评论
为什么被折叠?



