Category和Extension

转: http://blog.csdn.net/leikezhu1981/article/details/19091049框架

1、概述.net

类别是一种为现有的类添加新方法的方式。对象

利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需建立对象类的子类就能为现有的类添加新方法,能够为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。blog

 

2、示例继承

一、声明类别get

@interface NSString (CategoryDemo)编译器

-(NSNumber*) lengthAsNumber;源码

@endit

 

二、实现类别io

@implementation NSString (CategoryDemo)

-(NSNumber*) lengthAsNumber{

   

    NSUInteger length = [self length];

    return ([NSNumbernumberWithUnsignedInt: length]);

}

@end

 

三、调用:

NSMutableDictionary *dic =[NSMutableDictionarydictionary];

[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];

[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];

NSLog(@"%@", dic);

 

四、打印结果:

2012-07-27 17:43:32.993CategoryDemo[2193:f803] {

    hello = 5;

    world = 6;

}

 

3、类别的局限性

有两方面局限性:

(1)没法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具备更高的优先级。类别方法将彻底取代初始方法从而没法再使用初始方法。

 

4、类别的做用

类别主要有3个做用:

(1)能够将类的实现分散到多个不一样文件或多个不一样框架中,方便代码管理。也能够对框架提供类的扩展(没有源码,不能修改)。

(2)建立对私有方法的前向引用:若是其余类中的方法未实现,在你访问其余类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(没必要提供方法实现),编译器就不会再产生警告

(3)向对象添加非正式协议:建立一个NSObject的类别称为“建立一个非正式协议”,由于能够做为任何类的委托对象使用。

 

 

4、扩展extension

下面是extension和category的语法示例:

// extension

@interface MyObject(){

    int iextension;

}

-(void)testInExtension;// 类的mainimplementation不实现的话,有编译警告。

@end

 

// category

@interface  MyObject(categoryDemo){

   

    //   int icategory;   // error: Ivarsmay not be placed in categories

}

-(void)testInCategory;// 不强制要求在类的mainimplementation中实现

@end

 

// implementation

@implementation MyObject

//

//-(void)testInExtension{

//

//}

//

//-(void)testInCategory{

//

//}

@end

他们的主要区别是:

一、形式上来看,extension是匿名的category。

二、extension里声明的方法须要在mainimplementation中实现,category不强制要求。

三、extension能够添加属性(变量),category不能够。

相关文章
相关标签/搜索