zoukankan      html  css  js  c++  java
  • Objective-C分类 (category)和扩展(Extension)

    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 
  • 相关阅读:
    JavaScript中的valueOf与toString方法
    CSS的历史与工作原理
    Javascript让你的网页标题飘动起来
    getElementsByClassName的原生实现
    JavaScript去除空格trim()的原生实现
    JavaScript截取中英文字符串
    Keras函数式API介绍
    R语言kohonen包主要函数介绍
    在Shell直接运行Python命令并显示
    GitHub Pages
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4988817.html
Copyright © 2011-2022 走看看