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):语义上更强烈一些:要求采用该协议的类,"必须"实现协议中约定的方法

原文地址:https://www.cnblogs.com/PEPE/p/2681491.html