协议:Protocol 它可以声明一些必须实现的方法和选择实现的方法
作用:用来声明一些方法 由一些列的方法声明组成的
一个类可以遵守1个或多个协议
任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明
协议和继承的区别:
1.继承之后默认就有实现,而Protocol只有声明没有实现
2.相同类型的类可以使用继承,但是不同类型的类只能使用(Protocol)协议
3.Protocol可以用于存储方法的声明可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可
注意点:
1.协议只能声明方法,不能声明属性
{
int _age;
}
2.父类遵守了某个协议,那么子类也会自动遵守这个协议
3.在OC中一个类可以遵守1个或多个协议
注意:OC中的类只能有一个父类,也就是说OC中只有单继承
4.OC中的协议又可以遵守其它的协议,只要一个协议遵守了其它的协议,那么这个协议中就会自动包含其他协议的声明
基协议:
1.NSobject是一个基类,最根本最基本的类,任何其他类最终都要继承它
2.还有名字叫NSObject的协议,它是一个基协议,最根本最基本的协议
3.NSObject协议中声明很多最基本的方法
description
retain
release
4.建议每个新的协议都要遵守NSObject协议
@required和@optional关键字
1.协议中的2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional:这个方法不一定要实现
#import
#import"Student.h"
#import"OtherStudent.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
OtherStudent*other = [[OtherStudentalloc]init];
Student*stu = [[Studentalloc]init];
//判断是否遵循lamcoProtocol协议
if([stuconformsToProtocol:@protocol(lamcoProtocol)]) {
//判断有没有学习的能力
if([sturespondsToSelector:@selector(study)]) {
[stustudy];
}
//判断有没有帮助找到工作的能力
if([sturespondsToSelector:@selector(work)]) {
[stuwork];
}
}
//判断是否遵循BankProtocol协议
if([stuconformsToProtocol:@protocol(BankProtocol)]) {
//判断有没有还款的能力
if([sturespondsToSelector:@selector(giveme)]) {
[stugiveme];
}
}
if([otherconformsToProtocol:@protocol(lamcoProtocol)]) {
if([otherrespondsToSelector:@selector(work)]) {
NSLog(@"可以参加培训");
}
}else{
NSLog(@"不能参加培训");
}
}
return0;
}
#import
#import"lamcoProtocol.h"
#import"BankProtocol.h"
@interfaceStudent :NSObject
@end
#import"Student.h"
@implementationStudent
-(void)study
{
NSLog(@"每天按时上课,复习,预习,做项目");
}
-(void)work
{
NSLog(@"保证给你安排一个技术岗位");
}
-(void)giveme
{
NSLog(@"每月按时还款");
}
@end
#import
#import"lamcoProtocol.h"
#import"BankProtocol.h"
@interfaceOtherStudent :NSObject
@end
#import"OtherStudent.h"
@implementationOtherStudent
-(void)study
{
NSLog(@"每天按时上课,复习,预习,做项目");
}
-(void)work
{
NSLog(@"保证给你安排一个技术岗位");
}
-(void)giveme
{
NSLog(@"每月按时还款");
}
@end
//BankProtocol 协议
#import
@protocolBankProtocol
-(void)giveme;
@end
//lamcoProtocol 协议
#import
@protocollamcoProtocol
-(void)study;
-(void)work;
@end
协议的应用场景:
#import
#import"Person.h"
#import"WifeProtocol.h"
intmain(intargc,constchar* argv[]) {
@autoreleasepool{
Person*p = [[Personalloc]init];
//1.协议的第一个应用场景,可以将协议写在数据类型的右边,明确的标注如果想给该量赋值,那么该对象必须遵守某个协议
// Wife *w = [[Wife alloc] init];
Wife*w = [[Wifealloc]init];
p.wife= w;
[pshow];
}
return0;
}
#import
#import"Wife.h"
@interfacePerson :NSObject
//注意:类型限定是写在数据类型的右边
@property(strong,nonatomic)Wife *wife;
-(void)show;
@end
#import"Person.h"
@implementationPerson
-(void)show
{
//注意:虽然在接受某一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),但是并不意味着这个对象真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证
if([self.wiferespondsToSelector:@selector(cooking)]) {
[self.wifecooking];
}
if([self.wiferespondsToSelector:@selector(washing)]) {
[self.wifewashing];
}
if([self.wiferespondsToSelector:@selector(job)]) {
[self.wifejob];
}
}
@end
#import
#import"WifeProtocol.h"
@interfaceWife :NSObject
@end
#import"Wife.h"
@implementationWife
-(void)cooking
{
NSLog(@"%s",__func__);
}
-(void)washing
{
NSLog(@"%s",__func__);
}
-(void)job
{
NSLog(@"%s",__func__);
}
@end
#import
@protocolWifeProtocol
//会做饭
-(void)cooking;
//会洗衣服
-(void)washing;
//有一份好工作
-(void)job;
@end