使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。
我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。
下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。
1 #import <Foundation/Foundation.h> 2 3 /* 4 定义分类的过程大致可分为以下几个步骤: 5 第一步、创建一个带有接口的新文件,即创建已有类 6 7 第二步、在新文件中添加需要扩展的方法及方法的实现,即需要添加的分类 8 */ 9 //NSString 表示将要添加分类的类名称,该类必须是已存在的。 10 //CamelCase 是为类添加的方法名称。 11 //只能添加方法,不能添加变量。 12 //头文件命名惯例:ClassName+CategoryName.h 13 @interface NSString (CamelCase) 14 15 -(NSString*) camelCaseString; 16 17 @end 18 19 @implementation NSString (CamelCase) 20 21 -(NSString*) camelCaseString 22 { 23 //调用NSString的内部方法获取驼峰字符串。 24 //self指向被添加分类的类。 25 NSString *castr = [self capitalizedString]; 26 27 //创建数组来过滤掉空格, 通过分隔符对字符进行组合。 28 NSArray *array = [castr componentsSeparatedByCharactersInSet: 29 [NSCharacterSet whitespaceCharacterSet]]; 30 31 //把数组的字符输出 32 NSString *output = @""; 33 for(NSString *word in array) 34 { 35 output = [output stringByAppendingString:word]; 36 } 37 38 return output; 39 40 } 41 42 @end 43 int main (int argc, const char * argv[]) 44 { 45 46 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 47 48 NSString *str = @"My name is bill."; 49 NSLog(@"%@", str); 50 str = [str camelCaseString]; 51 NSLog(@"%@", str); 52 53 [pool drain]; 54 return 0; 55 }
关于扩展,你可以这样理解:扩展是一种匿名分类;但是和匿名分类不一样的是,扩展可以添加新的实例变量(是不是觉得扩展已经强大到非一般的地步了? ^_^)
从Xcode 4 之后就推荐在自定义类的.m文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。
下面是一个扩展的例子:
1 @interface MyClass : NSObject 2 - (float)value; 3 @end 4 5 6 @interface MyClass () { //注意此处:扩展 7 float value; 8 } 9 - (void)setValue:(float)newValue; 10 @end 11 12 @implementation MyClass 13 14 - (float)value { 15 return value; 16 } 17 18 - (void)setValue:(float)newValue { 19 value = newValue; 20 } 21 22 @end
Objective-C分类 (category)和扩展(Extension)
原文:http://www.cnblogs.com/PengGod/p/5294068.html