iOS category 和Extension,人家写的不错,转载一下

1、分类(category)

使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似。

我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义。

下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方法,就可以去掉一个字符串中的空格,并将原有空格后的单词改写成大写(即将字符串转化为驼峰式)。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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文件中使用扩展,这样就能保证良好的代码封装性,避免把私有接口暴露给外面。

下面是一个扩展的例子:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值