Objective-C中的类别(Category)的使用

原创 2012年03月23日 16:32:43

Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另一个是无需继承即可向现有的类添加新的方法以扩展其功能。

例如,您所在的开发团队需要创建一个类,每个团队成员负责类的某一部分功能,例如成员A负责编写对象的创建与释放的方法、成员B负责编写网络通信的方法、成员C负责数据的家在与保存方法等。iOS SDK中大量使用了类别,这里以NSArray类的外部接口声明为例(代码中以...省略了其他方法的接口声明):

@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
- (NSUInteger)count;
- (id)objectAtIndex:(NSUInteger)index;  
@end

@interface NSArray (NSExtendedArray)
- (NSArray *)arrayByAddingObject:(id)anObject;
- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;
- (NSString *)componentsJoinedByString:(NSString *)separator;
...
@end

@interface NSArray (NSArrayCreation)
+ (id)array;
+ (id)arrayWithObject:(id)anObject;
...
@end

@interface NSArray (NSDeprecated)
- (void)getObjects:(id __unsafe_unretained [])objects;
@end
注意类别的名字在小括号中,并且位于源类名之后。例如NSExtendedArray是类别名称,它扩展了NSArray类。
类别方法的实现格式如下:

@implementation NSArray (NSArrayCreation)
+ (id)array
{
    ...
}
...
@end

类别的实现部分可以放在类的实现文件中,也可以放在额外的实现文件中。

以上介绍的是有名的类别,有名的类别中只能添加静态方法或者实例方法,不能添加成员变量、属性。类别还有一种特殊的使用方式是创建无名的类别(也叫类的扩展),即括号内为空,例如(TestObject是一个类):

@interface TestObject ()
@property int extensionValue;
-(void)setExtensionName:(NSString*)name;
@end

注意到无名类别除了可以添加方法之外,还允许向类添加额外的成员变量和属性,它们的实现需要放在类的实现部分中。例如:

@implementation TestObject
@synthesize value = _value; //实现在类的外部接口中声明的value属性
@synthesize extensionValue = _extensionValue; //实现在无名类别中声明的extensionValue属性

-(void)setExtensionName:(NSString*)name
{
    NSLog(@"%d, %@", _extensionValue, name);
}
...
//实现其他类的方法
...
@end
注意无名类别中添加的方法,其访问级别为私有(@private),你可以在其中添加类的内部私有方法和成员。
#import "TestClass.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {        
        TestClass* tc1 = [[[TestClass alloc] init] autorelease];
        tc1.extensionValue = 2; //编译错误,私有成员无法访问
    }
    return 0;
}
以上代码无法通过编译,原因是在类扩展中定义的成员均为私有。

另外需要注意的是,类别的数量不受限制,一个类可以有很多的类别。类别中定义的方法的优先级高于类中定义的方法,也就是说当你在类别中定义了一个与源类中的签名完全一致的方法时,类别中的方法会完全覆盖源类中的方法,你无法调用源类中的方法。


相关文章推荐

Object-C学习笔记-Category(分类)

category这个名字感觉好抽象,事实上直接把它理解为提供类似JavaScript中动态改变类功能的一种途径。 但仍然无法做到像JS那样直接对某个对象实例中的方法直接动刀,而且这种机制只能针对类方...

Object-C中分类

什么是 objective-c 的分类? 有的时候,我们需要对原有的类添加一些功能(方法)作为源类扩展,他的功能是扩展类的能力。 分类需要注意的地方: 1:尽管分类可以访问原始类的实...

objective-c中Category 类别、扩展 专题总结

objective-c中Category类别(扩展类)专题总结 objective-c类别的作用? 通过类别的方式,可以将类的实现分散到不同的文件里。 haoxue 20...

Objective-C分类 (category)和扩展(Extension)

1、分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以...
  • yhawaii
  • yhawaii
  • 2011年11月19日 23:19
  • 44841

Objective-c分类

分类概述 在开发中,随着程序功能的增加,经常需要对类进行拓展。直接在类中修改或者在子类中添加新方法,代码会越来越难懂,继承体系会越来越复杂,难以维护。所以可以使用分类。分类的格式定义和类定义的格式相似...

【Objective-C】OC中类别(Category)基本概念与用法

类别(Category)的基本概念      封装是面向对象的一个特征,OC也不例外,但是有的时候我们会碰到这样的一种情况,不如我封装了一个类, 不想再动它了,可是随着程序功能的增加,需要在那个类...

objective-c的categories(分类)

objective-c的categories(分类)  一,当你想要为某个class 新增methods,你通常会扩充(extend,即继承)它。然而这不一定是个完美解法,特别是你想要重写一个cla...

Objective-C如何在category里加入成员变量

OC的category是一个非常好用的特性,它允许你在不改变源码的情况下kuo zhan

【Objective-C】OC中类别(Category)基本概念与用法

类别(Category)的基本概念      封装是面向对象的一个特征,OC也不例外,但是有的时候我们会碰到这样的一种情况,不如我封装了一个类, 不想再动它了,可是随着程序功能的增加,需要在那个类...

objective-c category类别的使用

类别是一种为现有的类添加新方法的方式。 //类别的作用: //(1)将类别实现分散到多个不同文件或多个不同框架中 //(2)创建私有方法的前向引用 //(3)向对象添加非正式协议 //类...
  • sinyran
  • sinyran
  • 2012年09月29日 11:15
  • 960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C中的类别(Category)的使用
举报原因:
原因补充:

(最多只允许输入30个字)