• ObjectiveC中的协议(Protocol)和类别(Category)


    1.什么是协议?

    2.协议与类别的声明和使用

    1.什么是协议

      在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议。协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承。

      协议包括正式协议和非正式协议。

      正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现。子类会继承其父类采用的协议,一个协议本身也可以采用别的协议

      非正式协议(类别):类别是Objective-C的一个语言特点,可以让你在无需子类化的前提下为一个类增加方法。凡是NSObject或其子类的类别,都是非正式协议。一个类不必实现非正式协议中的每个方法,只需实现它想要的方法就可以。声明非正式协议的类在向某个目标对象发送协议消息之前,必须首先向它发送respondsToSelector:消息并得到肯定的回答,才可以使用。

    2.协议与类别的声明和使用

      正式协议的声明很简单,在类声明的上方

    @protocol ProtocolName

    //方法声明

    @end

    在另一个采纳协议的类中声明

    @interface ClassName:NSObject<NSCopying>

    {

    //实例变量

    }

    //方法

    @end

      也可以采用多个协议,只需用逗号隔开

    @interface ClassName:NSObject<NSCopying,NSCoding>

    {

    //实例变量

    }

    //方法

    @end

      声明可选和必须实现的协议

    @protocol ProtocolName
    - (void)requiredMethod;
    @optional
    - (void)anOptionalMethod;
    - (void)anotherOptionalMethod;
    @required
    - (void)anotherRequiredMethod;
    @end//MyProtocol

      非正式协议(类别)声明和使用,类别名也要符合骆驼命名法。类别的声明和实现可以放在单独的 ”类别名.h/类别名.m“中,也可以放在已有类的.h/.m文件中。

      在类别的.m文件中加入@interface和@end,在这中间可以声明私有方法。

    @interface ClassName(categoryName)

    //方法定义

    @end

      实现

    @implementation ClassName(categoryName)
    //方法实现
    @end

      需要注意的是类别只能添加方法,不能添加实例变量。

    ------------------------------------------------------------------------------------------------------------------------

      不声明类别名的时候,是匿名类别或类扩展,可以为已存在的类添加实例变量,方法。只能放置在已有类的.h/.m中

    @interface ClassName(){

      //实例变量--只能在自身类内使用

    }

    //方法定义--在.h文件中声明为公开的,在.m中声明的方法为私有的。

    @end

  • 相关阅读:
    nyoj58 最少步数
    oj2787 算24
    一位ACMer过来人的心得
    hdu递推公式水题
    nyoj20 吝啬的国度
    hdu1421 搬寝室
    全排列生成算法:next_permutation
    hdu2544 最短路
    poj1691 Painting A Board
    hdu1274 展开字符串
  • 原文地址:https://www.cnblogs.com/sparks/p/3819841.html
Copyright © 2020-2023  润新知