zoukankan      html  css  js  c++  java
  • Category

    Category

    首先我们来谈谈Category。

    Objective-C提供了一种与众不同的方式——Catagory,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。

    实现起来很简单,我们举例说明。

    SomeClass.h
    @interface SomeClass : NSObject{
    }
    -(void) print;
    @end 
    

    这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:

    #import "SomeClass.h"
     
    @interface SomeClass (Hello)
    -(void)hello;
    @end
    

    实现文件代码如下

    #import "SomeClass+Hello.h"
    @implementationSomeClass (Hello)
    -(void)hello{
        NSLog (@"name:%@ ", @"Jacky");
    }
    @end 
    

    其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。

    调用也非常简单,毫无压力,如下: 首先引入Category的声明文件,然后正常调用即可。

    #import "SomeClass+Hello.h"
     
    SomeClass * sc =[[SomeClass alloc] init];
    [sc hello] 
    

    执行结果是:

    name:Jacky 
    

    Category的使用场景:

    1. 当你在定义类的时候,在某些情况下(例如需求变更),你可能想要为其中的某个或几个类中添加方法。
    2. 一个类中包含了许多不同的方法需要实现,而这些方法需要不同团队的成员实现
    3. 当你在使用基础类库中的类时,你可能希望这些类实现一些你需要的方法。

    遇到以上这些需求,Category可以帮助你解决问题。当然,使用Category也有些问题需要注意,

    1. Category可以访问原始类的实例变量,但不能添加变量,如果想添加变量,可以考虑通过继承创建子类。
    2. Category可以重载原始类的方法,但不推荐这么做,这么做的后果是你再也不能访问原来的方法。如果确实要重载,正确的选择是创建子类。
    3. 和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。

    用好Category可以充分利用Objective-C的动态特性,编写出灵活简洁的代码。

  • 相关阅读:
    域控制器的常规卸载,Active Directory系列之十三
    理解域信任关系,Active Directory系列之十六
    什么是站点,Active Directory系列之十一
    域控制器的强制卸载,Active Directory系列之十四
    详解操作主机角色,Active Directory系列之九
    【转】MapControl和PageLayoutControl的同步
    AE的一些接口小记
    【转】centos linux 上flv/swf视频服务器架设
    lnmp配置超精简免费flv流媒体服务器笔记
    Flash game 遊戲修改 Cheat Engine 5.4 使用教學
  • 原文地址:https://www.cnblogs.com/killiancheung/p/4635136.html
Copyright © 2011-2022 走看看