在开发项目的过程中,有时候需要为已有的类扩展一些新方法,这个时候最好的方法就是分类。
1 分类
分类的语法格式为:
1、分类的声明:
@interface 类名 (分类名称)
// 方法声明
@end
2、分类的实现:
@implementation 类名 (分类名称)
// 方法实现
@end
在声明部分,分类只能增加方法,不能增加成员变量;分类方法实现中可以访问主类中声明的成员变量。
- @interface Person : NSObject
- {
- int _age;
- }
- @property int age;
- - (void)test;
- @end
- //Person.m
- @implementation Person
- - (void)test
- {
- NSLog(@"Person-test");
- }
- @end
- //Persn的分类,Person+JJ.h
- @interface Person (JJ)
- - (void)test2;
- @end
- //Persn的分类,Person+JJ.m
- @implementation Person (JJ)
- - (void)test2 //实现分类中声明的方法
- {
- _age = 10; //访问主类的成员变量
- NSLog(@"-----test2,age=%d",_age);
- }
- - (void)test //分类中重新实现主类中的test方法,将会覆盖主类中的test方法,导致主类的方法无法使用
- {
- NSLog(@"Person (JJ)-test");
- }
- @end
复制代码
如上文的程序所示,分类中重新重新实现主类中的test方法,将会覆盖主类中的test方法,更特别的时,如果多个分类都重新实现了主类的某一个方法,则该方法將由最后参与编译的分类调用。即方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类(主类) --> 父类。
2 分类的应用
分类的应用,给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数; 给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数。
- // main方法
- #import <Foundation/Foundation.h>
- #import "NSString+Number.h"
- int main(int argc, const char * argv[])
- {
- //int count = [NSString numberCountOfString:@"2145aaaa52"];
-
- int count = [@"2145aaaa52" numberCount];
-
- NSLog(@"%d",count);
- return 0;
- }
- // NSString+Number.h
- #import <Foundation/Foundation.h>
- @interface NSString (Number)
- + (int)numberCountOfString:(NSString *)str;
- - (int)numberCount;
- @end
- // NSString+Number.m
- #import "NSString+Number.h"
- @implementation NSString (Number)
- + (int)numberCountOfString:(NSString *)str
- {
- // int count = 0;
- //
- // for (NSInteger i = 0; i < [str length]; i++) {
- // unichar c = [str characterAtIndex:1];
- // if ( c>='0' && c<='9') {
- // count++;
- // }
- // }
- // return count;
- return [str numberCount];
- }
- - (int)numberCount
- {
- int count = 0;
-
- for (NSInteger i = 0; i < [self length]; i++) {
- unichar c = [self characterAtIndex:1];
- if ( c>='0' && c<='9') {
- count++;
- }
- }
- return count;
- }
- @end
复制代码 |