协议: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 <Foundation/Foundation.h>
#import "Student.h" #import "OtherStudent.h" int main(int argc, const char * argv[]) { @autoreleasepool { OtherStudent *other = [[OtherStudent alloc] init]; Student *stu = [[Student alloc] init]; //判断是否遵循 lamcoProtocol 协议 if ([stu conformsToProtocol:@protocol(lamcoProtocol)]) { //判断有没有 学习 的能力 if ([stu respondsToSelector:@selector(study)]) { [stu study]; } //判断有没有 帮助找到 工作 的能力 if ([stu respondsToSelector:@selector(work)]) { [stu work]; } } //判断是否遵循 BankProtocol 协议 if ([stu conformsToProtocol:@protocol(BankProtocol)]) { //判断有没有 还款 的能力 if ([stu respondsToSelector:@selector(giveme)]) { [stu giveme]; } } if ([other conformsToProtocol:@protocol(lamcoProtocol)]) { if ([other respondsToSelector:@selector(work)]) { NSLog(@"可以参加培训"); } } else { NSLog(@"不能参加培训"); } } return 0;
}
#import <Foundation/Foundation.h> #import "lamcoProtocol.h" #import "BankProtocol.h" @interface Student : NSObject <lamcoProtocol,BankProtocol>
@end
#import "Student.h" @implementation Student -(void)study { NSLog(@"每天按时上课,复习,预习,做项目"); } -(void)work { NSLog(@"保证给你安排一个技术岗位"); } -(void)giveme { NSLog(@"每月按时还款"); }
@end
#import <Foundation/Foundation.h> #import "lamcoProtocol.h" #import "BankProtocol.h" @interface OtherStudent : NSObject <lamcoProtocol>
@end
#import "OtherStudent.h" @implementation OtherStudent -(void)study { NSLog(@"每天按时上课,复习,预习,做项目"); } -(void)work { NSLog(@"保证给你安排一个技术岗位"); } -(void)giveme { NSLog(@"每月按时还款"); }
@end
//BankProtocol 协议
#import <Foundation/Foundation.h> @protocol BankProtocol <NSObject> -(void)giveme;
@end
//lamcoProtocol 协议
#import <Foundation/Foundation.h> @protocol lamcoProtocol <NSObject> -(void)study; -(void)work;
@end
协议的应用场景:
#import <Foundation/Foundation.h> #import "Person.h" #import "WifeProtocol.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; //1.协议的第一个应用场景,可以将协议写在数据类型的右边,明确的标注如果想给该量赋值,那么该对象必须遵守某个协议 // Wife<WifeProtocol> *w = [[Wife alloc] init]; Wife *w = [[Wife alloc] init]; p.wife = w; [p show]; } return 0;
}
#import <Foundation/Foundation.h> #import "Wife.h" @interface Person : NSObject //注意:类型限定是写在数据类型的右边 @property(strong,nonatomic) Wife<WifeProtocol> *wife; -(void)show;
@end
#import "Person.h" @implementation Person -(void)show { //注意:虽然在接受某一个对象的时候,对这个对象进行了类型限定(限定它必须实现某个协议),但是并不意味着这个对象真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证 if ([self.wife respondsToSelector:@selector(cooking)]) { [self.wife cooking]; } if ([self.wife respondsToSelector:@selector(washing)]) { [self.wife washing]; } if ([self.wife respondsToSelector:@selector(job)]) { [self.wife job]; } }
@end
#import <Foundation/Foundation.h> #import "WifeProtocol.h" @interface Wife : NSObject <WifeProtocol>
@end
#import "Wife.h" @implementation Wife -(void)cooking { NSLog(@"%s",__func__); } -(void)washing { NSLog(@"%s",__func__); } -(void)job { NSLog(@"%s",__func__); }
@end
#import <Foundation/Foundation.h> @protocol WifeProtocol <NSObject> //会做饭 -(void)cooking; //会洗衣服 -(void)washing; //有一份好工作 -(void)job;
@end