OC Protocol
文章目录
1. protocol 基本概念
- protocol 翻译为 协议
- 在Java中有接客interface的概念, 接口就是一堆方法的什么没有实现,而在的interface是一个类的头文件的声明,并不是真正意义的接口的意思,在OC中是有一个叫protocol来实现的。
- protocol 可以用来声明一些必须实现或选择实现的方法,这个和Java中是完全不同的。
- protocol 的作用
-
- 用来什么一些方法
-
- 也就是说一个protocol是有一系列方法的声明来实现的。
2. protocol 语法格式
-
Protocol 的定义
@protocol 协议名称
// 方法声明列表
@end
- 用类去遵守协议protocol
-
- 任何类只要遵守了协议protocol就相当于有了protocol所有方法的声明。
-
-
一个类可以遵守一个或者多个协议。
@interface 类名:父类 <协议名称1,协议名称2>
@end
-
-
- 协议也可以继承协议!
3. protocol 和 继承的区别
- 继承之后就默认有了实现,而protocol 只有声明没有实现
- 相同类型的类中可以使用继承,比如老师学生都可以继承自人。但是不同类型的类只能使用协议Protocol。
- protocol可以用于存储方法中的什么,将多个类共同的方法抽取出来,以后让这些类去遵守协议即可。
4. protocol 使用注意
- protocol 就一个用途,就是用来存放一堆方法的声明,不能写实现,也不能声明属性、成员变量。
- 只要父类遵守了协议,子类就也遵守。
- OC中不支持多继承类, 但是可以继承多个协议,尖括号内用逗号隔开。继承是冒号:
- 协议可以遵守协议, 只要B协议遵守A协议, 遵守B协议的类C 就同时拥有了AB协议的所有方法声明。
创建一个类建议继承 NSObject
创建一个协议建议遵守 @protocol < NSObject >;
5. 基协议
- NSObject 是一个基类 ,最基本最根本的类,所有的类最终都是继承NSObject ;
- @protocol < NSObject > 是基协议,是最基本最根本的协议。
- 建议每个协议都遵守 @protocol < NSObject > 协议。
6. @required @optional 两个关键字的使用
- @required 是必须实现的方法。
- @optional 是必须实现的方法。
- 如果没有任何关键字修饰的方法,默认情况就是@required 必须实现的。如果类中没实现该方法,就会警告缺少该方法!
- @optional 没有实现不会警告
- 作用范围 出现开始 到 下一个关键字为止,用于程序猿交流。
7. 使用场景
- 注意 变量赋值的时候 ! // 创建wife的时候直接在wife右边要求满足协议。 协议使用第一个应用场景,可以将协议写在数据类型的右边,明确表示如果要给该变量赋值, 必须要该对象遵守这个协议
- 注意 成员属性定义时 可以写入协议//类的声明中! 注意 类型限定一定是写在类型数据的右边!!!
- 注意 虽然接收了某一个对象的时候,对这个对象进行了类型限定(限定其必须实现某个协议),但是并不是意味着对象就真的实现了协议里的方法。所以要在调用对象的协议方法时候进行一次验证。
防止光说不做 赖皮!
if ([self.wife respondsToSelector(cooking)])
{
[self.wife cooking];
}
- 设定场景
- 某程序猿要找一个媳妇 ,要求会做饭,会洗衣服,有国企工作的漂亮女生。
- 满足条件的女生都可以向他发送消息。
@protocol wifeCondtion < NSObject >
-(void)cooking;
-(void)washing;
-(void)job;
@end
//协议使用第一个应用场景,可以将协议写在数据类型的右边,明确表示如果要给该变量赋值, 必须要该对象遵守这个协议
wife < wifeCondtion > * wifeName =[[ wife alloc]init];
@interface Person : NSObject
//注意 类型限定一定是写在类型数据的右边!!!
@property (nonatomic,strong)Wife < WifeCondtion> * wife;
@end
8. 代理设计模式
* 引申 @private @protected @public
指令 | 含义 |
---|---|
@private | 作用范围只能在自身类 |
@protected | 作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。 |
@public | 作用范围最大,在任何地方 |
2015-04-03 21:36:19 Edit with Markdown © Yun.