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;
}
以上代码无法通过编译,原因是在类扩展中定义的成员均为私有。

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


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

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

objective-c的categories(分类)

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

objective-c 基本类型和对象类型解读

我将用最简单的话来描述我所理解的oc数据类型。       1.基本类型(primitive type)    (1) 常用数据类型  int / float /long / Boolen /NS...
  • qq_28699153
  • qq_28699153
  • 2015年12月25日 11:49
  • 350

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

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

Category 类别 -Objective-C

category 是Objective-C 里面最常用到的功能之一。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。如...
  • iukey
  • iukey
  • 2012年03月11日 10:24
  • 11762

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

Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另一个是无需继承即可向现有的类添加新的方法以扩展其功能。 例如,您所在的开发团队需要创建一个类,每个团队...
  • pucker
  • pucker
  • 2012年03月23日 16:32
  • 4521

Objective-C分类 (category),扩展(Extension)和协议(protocol)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式 2.类目的局限性: 1)类目无法向已有的类中添加实利变量; 2)如果类目中的方法和已有类...
  • humingtao2013
  • humingtao2013
  • 2014年03月18日 19:26
  • 4340

Objective-C中的类别(Category)

Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另一个是无需继承即可向现有的类添加新的方法以扩展其功能。 例如,您所在的开发团队需要创建一个类,每...
  • ffblog
  • ffblog
  • 2015年05月18日 18:14
  • 126

【Objective-C】类别(拓展类)、协议

一、类别简介  OC中类别功能强大,它能够在不使用继承的情况下向现有的类添加新的方法。特别是在没有类的源代码的情况下,通过使用类别依然能够向该类添加新的方法。  类别的主要有两个作用,一是向类添加新的...
  • haojie2014
  • haojie2014
  • 2015年08月13日 10:58
  • 441

objective-c 如何获得文件的类型?

如果想获得类似:com.adobe.pdf 格式的类型,可以使用这个函数:[[NSWorkspace sharedWorkspace] typeOfFile:pathToFile error:nil]...
  • flame_007
  • flame_007
  • 2018年01月18日 10:42
  • 9
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C中的类别(Category)的使用
举报原因:
原因补充:

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