- 协议里面不能声明变量,只能定义方法。
- 一个类要遵守某个协议,如果没有实现协议的方法,不会报错,只会有警告。
- 协议间的遵守,基协议(类似于继承,协议B可以继承协议A,此刻协议B也拥有协议A里面的方法)
协议A----- MyProtocol
#import <Foundation/Foundation.h>
@protocol MyProtocol
/*!
* 协议默认是必须实现的
*
*/
@required
- (void)test1;
/*!
* optional 表示可选的
*
*/
@optional
- (void)test2;
@end
协议B----- MyProtocol1
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@protocol MyProtocol1 <MyProtocol>
- (void)test3;
@end
- 比如Person类遵守协议B,那Person类就要实现协议B里面的
test3
方法以及协议A里面的test1
方法。
要求:obj1保存的对象必须遵守MyProtocol1这个协议
//1
NSObject<MyProtocol1> *obj1 = [[Person alloc] init];
//2
id<MyProtocol1> obj2 = [[Person alloc] init];
//3
Person<MyProtocol1> *obj3 = [[Person alloc] init];
- 为了提高性能,我们要用到的时候才import协议。说明白点就是,你可以在
.h
文件里面像@class
一样先@protocol
一个协议,告诉编译器,我这是一个协议(此刻我并不关心协议的具体内容)。然后使用到的时候才在.m
文件里面import这个协议的头文件
#import <Foundation/Foundation.h>
@protocol MyProtocol1
@end
@interface Person : NSObject <MyProtocol1>
@end
#import "Person.h"
#import "MyProtocol1.h"
@implementation Person
- (void)test1 {
}
- (void)test3 {
}
@end
定义一个变量的时候,限制它遵守某个协议(和上面类似)
NSArray<MyProtocol> *obj;
@property(nonatomic, strong) NSArray<MyProtocol> *obj1;