本着服务自己的原则,坚持书写!
protocol:(协议)符号:<>
声明一大堆方法(不能声明成员变量),只要某个类遵守了这个协议,那么相当于拥有这个协议的所有方法声明。
父类遵守了某个协议,那么子类也遵守了。
书写格式:
@protocol 协议名称
//方法声明列表
@end
同时需要注意两个关键字
@required // 要求实现,不实现就会发出警告 (默认情况)
@optional // 不要求实现
// 定义了一个名叫MyProtocol的协议
@protocol MyProtocol <NSObject>
- (void)test3;
@required
- (void)test;
- (void)test1;
@optional
- (void)test2;
@end
在其他类的声明中就要遵守这个协议:
@interface Person : NSObject <MyProtocol>
注:后面的“<>”中可以书写多个协议,只要中间用“,”隔开
@interface 协议名称 : NSObject <协议1,协议2>
@end
例如:
@interface Person <MyProtocol, MyProtocol2, MyProtocol3>
@end
协议间的遵守和基协议
一个协议遵守了另外一个协议,就拥有了另外一个协议所拥有的方法声明
@protocol 协议1 <协议2> // 协议1里面拥有协议2的所有方法,不必再去写方法的声明了
基协议:<NSObject>
所以写协议要这样:
@protocol MyProtocol <NSObject> // 遵守基协议<pre name="code" class="objc">@end
或者:
@protocol MyProtocol2 <MyProtocol> // 遵守MyProtocol协议,也就相当于遵守了NSObject协议<pre name="code" class="objc">@end
限制对象类型:
// 要求a1,保存的对象必须遵守MyProtocol,并且继承了Person
Person<MyProtocol> *a1 = [[Person alloc] init];
a1 = nil;
// 要求obj,保存的对象必须遵守MyProtocol、并且继承了Person
Person<MyProtocol> *obj = [[Person alloc] init];
id<MyProtocol> obj4 = [[Person alloc] init];
obj4 =nil;
遵守协议的set方法:
@property (nonatomic, strong) id<MyProtocol> a;
协议的提前声明:
l类的声明:可以使用@class提前声明一个类
@class Person
协议也可以:
@protocol MyProtocol;
但是真正需要协议的时候,必须在.m文件中声明#import <MyProtocol.h>