• ios category类别的使用


    ios category类别的使用

    Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只需要知道这个类的公开接口,不需要知道类的源代码。需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。

     http://www.cnblogs.com/hopeanCom/archive/2012/11/16/2773110.html
    类别的基本语法如下:
    @interface ClassName(CategoryName)
    //method declarations
    @end
    @interface 类名(类别名)
    类别方法申明
    @end

    注意几点:

    1.现有类的类名位于 @interface之后

    2.括号中是类别的名称(只要名称唯一,可以添加任意多的类别)

    3.类别没有实例变量部分

    类别的语法与类的语法非常相似。类别的方法就是类的方法。类别的定义可以放在一个单独的文件中("类别名.h"), 也可以放在一个已存在的类的定义文件中(.h文件)。类别的实现则可放在一个单独的“类别名.m”文件中,或另一个类的实现文件中。这点也与类的定义相似。因为类别的方法就是类的方法,所以类别的方法可以自由引用类的实例变量(无论公有或私有)。
     
    子类(subclassing)是进行类扩展的另一种常用方法。与子类相比,类别最主要的优点是:系统中已经存在的类可以不需修改就可使用类别的扩展功能。例如,假设系统中存在一个类A;另外一个类B中定义了一个类A类型的实例变量,并包含了类A的头文件“#import <A.h>"。假设一段时间后,需要对类A扩展几个新的方法。如果用子类,就需要创建一个子类A-1。如果类B想要使用类A的新方法,就要进行如下修改:1) 将包含的头文件改为"#import<A-1.h>"; 2)将所有用到的类A对象改为类A-1的对象。可以想象,如何有很多类需要用到类A的新功能(比如类A是iOS中的类UIViewController),随着系统的升级(iOS从1.0到5.0),你的程序需要不停地进行这种繁琐地修改。如果使用类别,即使类A升级了,系统中其它的类可以不需任何修改,直接就可以调用类A的新方法。 
     
    类别的第二大优点是实现了功能的局部化封装。类别定义可以放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。如果另一个类(类B)不需要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOS SDK中广泛运用这种类别定义法来封装功能。例如,在 UINavigationController.h中定义了专为UINavigationController扩展的UIViewController类别:
     
    @interface UIViewController (UINavigationControllerItem)
    @property(nonatomic,readonly,retain) UINavigationItem *navigationItem; 
    @property(nonatomic,readonly,retain) UINavigationController *navigationController; 
    ......
    @end
    如果一个类不引用UINavigationController.h,也就不会看到navigationItem和navigationController这两个性质申明(declared property)。
     
    类别的另一个优点是轻巧(light-weight)。很多时候,对已存在的类所需的扩展仅仅是几个新方法。这时,用类别避免了在系统中留下很多非常短小的“微”子类,使程序更加紧凑。
     
    归纳:

    1、实现类别

    同实现类相似,实现方法即可

    2、 类别的局限性

    1.类别不能添加新的实例变量

    2.命名冲突,如果类别中方法和类中已有方法同名,则类别具有更高优先级

    3 类别的作用

    1.将类的实现分散到多个不同文件或多个不同框架中

    2.创建私有方法的前向引用

    3.向对象添加非正式协议

    4 通过类别我们可以为类簇这种不好创建子类的类来添加方法。

    4 利用类别分散实现

    利用类别可以将类的方法分散到多个源文件中

    特别指出的是:类别可以访问其继承的类的实例变量

    在使用一个方法时,对象的方法是在接口中声明、父类中声明、还是类别中声明并不重要

    类别不仅可以分散实现到不同源文件,也可跨框架

    5、 使用类别创建前向引用

    虽然可以实现未声明的方法,但是编译器会提出警告

    通过类别可以提供声明,而且,声明的方法不必要一定在类别的实现中实现,也可以在类的实现中实现

  • 相关阅读:
    【24.17%】【codeforces 721D】Maxim and Array
    【26.42%】【codeforces 745C】Hongcow Builds A Nation
    【67.24%】【codeforces 745A】Hongcow Learns the Cyclic Shift
    【37.50%】【codeforces 745B】Hongcow Solves A Puzzle
    【78.89%】【codeforces 746A】Compote
    【75.28%】【codeforces 764B】Decoding
    【30.43%】【codeforces 746C】Tram
    【21.58%】【codeforces 746D】Green and Black Tea
    四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
    xml常用四种解析方式优缺点的分析×××××
  • 原文地址:https://www.cnblogs.com/HypeCheng/p/4801214.html
Copyright © 2020-2023  润新知