Objective-C 编程语言(4) 协议---协议对象,采纳协议,遵守协议

转载请标明出处:http://blog.csdn.net/zhangxingping

协议对象

    正如在运行时类对象代表类,选择器(selector)代表方法一样,正式的协议是通过一个特殊的数据类型来表示的,那就是协议类。需要处理协议的代码中必须使用协议对象来代表协议。
    协议和类的定义有很多相似之处。他们中都声明了方法,在运行时都是由对象来表示的,其中类是由类对象来表示的,协议是由协议实例来表示的。和类对象一样的是:协议对象是在源码中定义和声明的时候被自动创建的,是由运行时系统来使用的,不需要在源码中进行空间分配和初始化。
    在源码中我们可以使用@protocol命令字来表示协议。命令字和声明协议是一样的,只是在其后面多了一对括号。括号中为协议名称:
    Protocol * myXMLSupportProtocol = @Protocol(MyXMLSupport);
    这是在代码中得到协议对象的唯一方法。和类名称不同的是,协议名称并不能代表指定的对象,除非它被放置在@protocol()的括号中。
    编译器会为遇到的协议创建协议对象,但是这有两个要求:
    ● 该协议被类遵守, 或者
    ● 在代码中被通过@protocol()的方式引用了。
    那些只被声明而没有被使用的协议在运行时是没有对应的协议对象的。    

采纳协议(adopt)

    声明类采纳某个协议和声明其超类的方式有些类似。两者都会为类增加方法。声明超类为类增加继承而来的方法;声明采纳协议则是为类增加协议中的方法。如果在声明类的时候,在类的超类后面使用尖括号包括了协议列表,我们就说该类采纳了这些协议:
    @interface 类名: 超类名称<协议列表>
    类别采纳协议的声明方式和上面的差不多:
    @interface 类名(类别名称)<协议名称>
    一个类可以采纳多个协议,这些协议之间用逗号隔开:
    @interface Formatter:NSObject<Formatting,Prettifying>
    采纳某个协议的类或者类别必须实现该协议中所有的required的方法;否则编译时会警告。在上面的示例中类Formatter将需要定义除了他自身的方法之外,还要定义他所采纳的两个协议的所有required(必需)的方法。
    采纳某个协议的类或者是类别必须引入声明协议的头文件。被采纳的协议中的那些方法不再需要在类或者类别的任何地方进行声明了。
    一个类只是采纳某个协议而不定义自身的方法是完全有可能的。例如,下面的代码段中,类Formater就采纳了Formatting和Prettifying两个协议,但是没有自身的实例变量或者是方法:
    @interfade Formatter : NSObject < Formatting, Prettifying >
    @end

遵守协议

    如果一个类采纳了某个协议或者是继承了某个采纳了该协议的类,那么我们就说这个类遵守这个协议。此时,可以说该类的实例也遵守了相同的协议。
    由于采纳了某个协议的类或者对象必须实现该协议中的所有的required的方法,也就是说遵守了某个协议的类或者对象就拥有了该协议中声明的所有方法。
    我们可以通过向一个对象发送conformsToProtocol:消息来检查该对象是否遵循某个协议:
    if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]
    {
        //receiver没有遵守MyXMLSupport协议,此时如果期望receiver实现MyXMLSupport协议中的方法,可能会出错。
    }
注意:有一个类方法,名称也是conformsToProtocol:。)    
    就一个方法来说,conformsToProtocol:检测和respondsToSelector:检测是类似的。conformsToProtocol:检测的是某个协议是否被遵守;而respondsToSelector:检测的是某个方法是否被实现。但是,由于conformsToProtocol:检测的是协议中的所有方法,因此它比respondsToSelector:更有效些。
conformsToProtocol:检测和isKindOfClass:检测也很类似。只不过conformsToProtocol:是基于协议进行的一种检测;而isKindOfClass:是基于继承关系的一种检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值