zoukankan      html  css  js  c++  java
  • ObjectiveC 日记⑨ 类别Category

    类别(Category)['kætiɡəri] n. 种类,分类;范畴
      定义:为现有的类添加新方法

    一、声明类别

        类别的声明与类的声明格式相似,如下:

    @interfaceNSString (NumberConvenience)//convenience [kən'vi:njəns]n. 便利;厕所;便利的事物-(NSNumber *) lengthAsNumber;
    @end    

      该声明具有如下特点:

        1、现有的类位于@interface关键字之后,该方法表示向NSString类中添加一个名称NumberConvenience的类别。注意:要保证类别名称的唯一性

        2、可以添加其他类别的类(本例中是NSString你也可以添加其他类)和方法。别问了以@end结束。

      与类的区别:类别中不可以声明实例变量

    二、实现类别

        @implementation NSString (NumberConvenience)
        -(NSNumber *) lengthAsNumber
        {
            unsigned int length =[self length];
            return ([NSNumber numberWithUnsignedInt:length]);
        }
        @end

    说明:lengthAsNumber方法通过[self length]来获得字符串长度。

    eg:

      创建一个新的NSMutableDictionary类的对象并添加一个字符串及其长度,分别做键和值。

    int main(int argc,const char *argv[])
        {
            NSAutoreleasePool *pool;
            pool=[[NSAutoreleasepool alloc] init];
            NSMutableDictionary *dict;
            dict =[NSMutableDictionary dictionary];
            [dict setObject:[@"hello" lengthAdNumber] forKey:@"hello"];
            NSLog(@"%@",dict);
            [pool release];
            return (0);
        }

      暂无mac 运行结果(不出bug)为5

    三、局限性及作用

    局限性:

      1、无法向类中添加新的实例变量;

      2、命名容易起冲突,简单的说就是类别中的方法名和现有的方法名重名;当冲突时你的类别方法将取代初始方法(类别的优先级高)

    作用:

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

      2、创建对私有方法的前向引用 前向引用声明不能声明该类的对象, 也不能在内联成员函数中使用该类的对象, 只能声明该类的指针, 引用, 函数形参和返回类型

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

        注:非正式协议(interface) oc中的协议跟c#中的接口(interface)区别:c#中接口是强制必须实现的,否则编译报错,而obj-c虽然在编译时会警告,但是最终能编译通过。

          正式协议(protocal):语义上更强烈一些:要求采用该协议的类,"必须"实现协议中约定的方法

  • 相关阅读:
    JavaScript之DOM查询
    JavaScript之this解析
    Qt之pro文件解析
    Qt5 调试之详细日志文件输出(qInstallMessageHandler)
    修改 Ubuntu的源为阿里源
    Unable to acquire the dpkg frontend lock
    gcc编译中文字符串后,windows控制台输出乱码
    stm32f103 time2配置,转载
    取反
    单片机,struct ,union定义标志,节约RAM
  • 原文地址:https://www.cnblogs.com/PEPE/p/2681491.html
Copyright © 2011-2022 走看看