协议与委托

来源:互联网 发布:大数据金融论坛 编辑:程序博客网 时间:2024/05/17 14:17

协议与委托

协议(protocol)是OC的一个重要知识点,用于定义多个类应该遵守的规范。
读者可能经常听到“接口”一次,比如PCI接口、AGP接口等,因此,很多读者认为借口等同于主机板上的插槽,这其实是一种错误的认识。当我们说PCI接口时,指的是主机板上那条插槽遵守的PCI规范,而具体的PCI插槽只是一个实例。
OC中协议的作用相当于其它语言中接口的作用。
协议定义的是多个类共同的公共行为规范,这意味着协议里通常是定义的一组公用方法,但不会为这些方法提供实现(在正式协议里),方法的实现交给实现类去完成。
使用类别实现非正式协议:
通过前面的介绍可知,类别(catgory)可以实现非正式协议,这种类别以NSObject为基础,为NSObject创建类别,创建类别时即可指定该类别新增的方法。对于实现非正式协议的类而言,OC并不强调实现该协议的所有方法。
正式协议的定义:
和定义类不同,正式协议不再使用@interface、@implementation关键字,而是使用@protocol关键字。定义协议的基本语法如下:
@protocol 协议名<父协议1、父协议2>
{
大于等于零个方法定义;
}
1、协议名与类名采用相同的命名规则;
2、一个协议可以有多个直接父协议;
3、正式协议定义的方法只有方法签名,没有方法实现。
协议的继承和类继承不一样,协议完全支持多继承。和类继承相似的是:子协议继承某个父协议时将会继承协议里定义的所有方法。
实现协议:
在类的接口部分可以指定该类继承的父类,以及遵守的协议,语法如下:
@interface 类名:父类<协议1,协议2...>
从上面的语法可以看出,一个类可以遵守多个协议。
如果程序需要使用协议来定义变量,由如下两种方法:
1、NSObject<协议1,协议2...>*变量;
2、id<协议1,协议2...>变量;
通过上面的语法格式定义的变量,它们编译时类型仅仅只是所遵守的协议类型,因此只能调用该协议中定义的方法。
为了弥补遵守正式协议必须实现协议所有方法造成的灵活性不足,OC2.0增加了两个关键字:
1、@optional:可实现的方法;
2、@required:必须实现的方法。
协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好地通用性,因为具体的动作交给了实现类来完成。无论是基于Mac的Cocoa应用开发还是IOS应用开发,各种应用程序大量依赖委托这个概念,在这里并不打算细谈委托,因为我还不懂,只知道委托是一种解决问题的模式。


0 0