协议与委托

一. 协议

1. 类似于接口,用于定义多个类应该遵守的规范:

  并不关心这些类的内部状态数据,也不关心这些类里方法的具体实现,只是规定这些类要提供某些方法。

2. 使用@protocol关键字:

1 @protocol 协议名 <父协议1, 父协议2, ...>
2 {
3   statement...    
4 }

  注意:

    • 一个协议可以继承多个协议,但是协议不能继承类
    • 方法:只是声明,没有具体实现。

3.  遵守协议的类(即代理):

  • 如果没有实现协议中的所有方法,编译器会发出警告:
    • @optional:声明的方法可选择是否实现
    • @required:声明的方法是必须要实现的。@required是默认行为
@protocol FKPersonAction
// 定义协议的方法
@optional
- (void) makeUp;
@required
- (void) walk;
@end

  可选实现makeup方法,但是必须实现walk方法,否则编译器就会提示警告

4. 声明对象的方法:

  • 方法一:实现类定义对象
FKPerson *person = [[FKPerson alloc] init];
  • 方法二:协议来定义对象
    • NSObject<协议1, 协议2, ...> *变量;
    • id<协议1, 协议2, ...> *变量;
  • 注意:
    • 采用协议来定义对象,类似于其他语言使用接口定义变量的语法
    • 采用协议来定义对象,对象的编译时类型仅仅是所遵守的协议类型,所以只能调用该协议中定义的方法

二. 协议与委托(delegate)

1. 协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性,因为具体的动作将有该协议的实现类去完成。

原文地址:https://www.cnblogs.com/rachel-pzl/p/8167926.html