首页 > 其他 > 详细

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

时间:2016-03-19 00:58:11      阅读:256      评论:0      收藏:0      [点我收藏+]

1、分类(category)

使用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 }  

2、扩展(Extension)

关于扩展,你可以这样理解:扩展是一种匿名分类;但是和匿名分类不一样的是,扩展可以添加新的实例变量(是不是觉得扩展已经强大到非一般的地步了? ^_^)

从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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!