转: 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不能够。