protocol:协议 (相当于C#中的接口)
协议最多用在:代理模式、观察者模式
OC中类只支持单继承,但是可以遵守多份协议 <协议1,协议2,协议3。。。。。>
定义一个名叫MyProtocol的协议
@protocol MyProtocol
@end
只要一个类遵守了谋一份协议,就能拥有这份协议中所有的方法声明
一个类遵守某份协议的方法:
@interface Person : NSObject <MyProtocol>
@end
: 继承
<> 遵守协议
@protocol MyProtocol
@required //在这个关键字之后的方法声明都要求实现,不实现就会有警告(默认就是@required)
@optional //在这个关键字之后的方法声明不要求实现(不实现也不会有警告)
@end
协议也可以遵守另一个协议(就像C#中接口可以实现另一个接口一样)
一个协议遵守了另外一个协议,就可以拥有另一个协议的所有方法声明
基协议:
1、NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
2、其实还有一个基协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
3、NSObject协议中声明很多最基本的方法,比如description、retain、release等
4、建议每个新的协议都要遵守NSObject协议
可以使用协议限制对象类型:
要求obj,保存的对象必须遵守MyProtocol协议、并且继承了Person
Person<MyProtocol> *obj = [[Person alloc] init];
一个类需要遵循协议的时候需要引用协议
一种方法是#import <MyProtocol.h>
一种方法是@protocol MyProtocol (使用这种方法的时候需要再对应的 .m 文件中#import <MyProtocol.h>)优先使用这种方法
总结:
1、协议的定义
@protocol 协议名称 <NSObject>
//方法声明列表。。。。。
@end
2、如何遵守协议
-》类遵守协议
@interface 类名:父类名 <协议名称1,协议名称2........>
@end
-》协议遵守协议
@protocol 协议名称 <其他协议名称1,其他协议名称2...........>
@end
3、协议中方法声明的关键字
-》@required(默认) 要求实现,如果没有实现,会发出警告
-》@optional 不要求实现,怎样都不会有警告
4、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5、@proerty中声明的属性也可以用做一个遵守协议的限制
@property (nonatomic , strong) 类名<协议名称> *属性名;
@property (nonatomic , strong) id<协议名称> 属性名;
@property (nonatomic , strong) Dog<MyProtocol> *dog;
@property (nonatomic , strong) id<MyProtocol> dog;
6、协议可以定义在单独的.h文件中,也可以定义在某个类中
如果这个协议只用在某个类中,应该把协议定义在类中
如果这个协议用在很多类中,应该定义在单独文件中
7、分类可定义在单独的 .h和 .m文件中,也可定义在原来类中
一般情况下,都是定义在单独文件中
定义在原来类中的分类,只要求能看懂语法