类别(Category)笔记

2018-04-08  本文已影响0人  Emiya_zhang

1.类别(category)

(1)类别的出现

编写面向对象的程序时,我们常常要为我们现有的类添加新的功能,我们通常会选择创建子类的方法来拓展我们的功能需求。但是对于有些时候,子类并不方便,比如NSString和NSArry这种采用了了类簇的类,创建子类时非常困难,当用到一些工具集时,用这些类创建的子类可能无法处理,如NSString的stringWithFormat:类方法产生的字符串,你的NSString新子可能无法返回。我们利用OC的动态运行分配机制,可以为现有的类添加新方法,这种方法称之为类别(category)

(2)类别的使用

类别是为已经存在的类添加新方法的Objective-C 2.0语言特性,它的使用场景如下

  1. 为已经存在的类添加新方法
  2. 将自己的类方法实现分散到多个源文件中
  3. 声明私有方法
  4. 模拟多继承
  5. 把框架的私有方法公开

其中1为其主要用法;2,3为苹果官方推荐的其他用法[Category];4,5说法源自美团[深入理解的Objective-C:类别]

《Objective-C基础教程》中推荐类别代码置于新文件中,一般以“类名称+类别名称”的方式命名。如我们为NSString添加一个NumberConvenience的类别,命名为NSString+NumberConvenience。类别声明与实现如下

@interface NSString (NumberConvenience)
- (NSNumber *) lengthAsNumber;
- (NSNumber *) valueAsNumber;
@end  //NumberConvenience
@implementation NSString (NumberConvenience)
- (NSNumber *) lengthAsNumber
{
    NSUInteger len = [self length];
    return ([NSNumber numberWithUnsignedInt:len]);
}//lengthAsNumber

- (NSNumber *) valueAsNumber
{
    //code here
}
@end  //NumberConvenience

我们可以发现类别来添加新方法与自定义类的形式非常相似,不过是括号中指明为类创建的新类别的名字。

在文件中包含我们的头文件就可以使用这些新方法了

#import <Foundation/Foundation.h>
#import "NSString+NumberConvenience"
int main(int argc, const char * argv[]) 
{
    NSString * ast = [NSString stringWithFormat:@"123"];
    NSNumber * test = [ast lengthAsNumber];
    //some code
    return 0;
}

注意:

  1. 使用类别无法向类中添加新的实例变量,类别没有空间容纳实例变量
  2. 名称冲突时将会优先访问类别中的方法,将会取代初始的方法,所以最好给自己的类别方法添加前缀。
  3. 和普通接口有所区别的是,在分类的实现文件中可以不必实现所有声明的方法,只要你不去调用它。
这样我们可以通过将不同的方法实现放入不同的类别中实现了代码的分散和私有方法。

与类拓展extension相比

类拓展括号中不添加类别名,可以添加实例变量。

上一篇 下一篇

猜你喜欢

热点阅读