黑马程序员技术交流社区

标题: OC语言的分类 [打印本页]

作者: chenhuan_ccit    时间: 2014-11-1 20:51
标题: OC语言的分类
在开发项目的过程中,有时候需要为已有的类扩展一些新方法,这个时候最好的方法就是分类。
1    分类
分类的语法格式为:
1、分类的声明:
@interface 类名 (分类名称)
// 方法声明
@end
2、分类的实现:
@implementation 类名 (分类名称)
// 方法实现
@end
在声明部分,分类只能增加方法,不能增加成员变量;分类方法实现中可以访问主类中声明的成员变量。

  1. @interface Person : NSObject
  2. {
  3.     int _age;
  4. }
  5. @property int age;
  6. - (void)test;
  7. @end

  8. //Person.m
  9. @implementation Person
  10. - (void)test
  11. {
  12.     NSLog(@"Person-test");
  13. }
  14. @end

  15. //Persn的分类,Person+JJ.h
  16. @interface Person (JJ)
  17. - (void)test2;
  18. @end

  19. //Persn的分类,Person+JJ.m
  20. @implementation Person (JJ)
  21. - (void)test2 //实现分类中声明的方法
  22. {
  23.     _age = 10; //访问主类的成员变量
  24.     NSLog(@"-----test2,age=%d",_age);
  25. }
  26. - (void)test //分类中重新实现主类中的test方法,将会覆盖主类中的test方法,导致主类的方法无法使用
  27. {
  28.     NSLog(@"Person (JJ)-test");
  29. }
  30. @end
复制代码

如上文的程序所示,分类中重新重新实现主类中的test方法,将会覆盖主类中的test方法,更特别的时,如果多个分类都重新实现了主类的某一个方法,则该方法將由最后参与编译的分类调用。即方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类(主类) --> 父类。
2    分类的应用
分类的应用,给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数; 给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数。

  1. // main方法
  2. #import <Foundation/Foundation.h>
  3. #import "NSString+Number.h"

  4. int main(int argc, const char * argv[])
  5. {
  6.     //int count = [NSString numberCountOfString:@"2145aaaa52"];
  7.    
  8.     int count = [@"2145aaaa52" numberCount];
  9.    
  10.     NSLog(@"%d",count);
  11.     return 0;
  12. }

  13. // NSString+Number.h
  14. #import <Foundation/Foundation.h>

  15. @interface NSString (Number)

  16. + (int)numberCountOfString:(NSString *)str;

  17. - (int)numberCount;


  18. @end


  19. // NSString+Number.m
  20. #import "NSString+Number.h"

  21. @implementation NSString (Number)

  22. + (int)numberCountOfString:(NSString *)str
  23. {
  24. //    int count = 0;
  25. //   
  26. //    for (NSInteger i = 0; i < [str length]; i++) {
  27. //       unichar c = [str characterAtIndex:1];
  28. //        if ( c>='0' && c<='9') {
  29. //            count++;
  30. //        }
  31. //    }
  32. //    return count;
  33.     return [str numberCount];
  34. }


  35. - (int)numberCount
  36. {
  37.     int count = 0;
  38.    
  39.     for (NSInteger i = 0; i < [self length]; i++) {
  40.         unichar c = [self characterAtIndex:1];
  41.         if ( c>='0' && c<='9') {
  42.             count++;
  43.         }
  44.     }
  45.     return count;
  46. }

  47. @end
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2