1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到;
当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如下
// 声明
@interface 类名 (分类名称)
@end
// 实现
@implementation 类名 (分类名称)
@end
2:分类的好处,当一个类比较庞大时,不同的部分可以放到不同的分类中,也方便团队中类的开发;
3:分类使用注意:
a:分类不能增加成员变量,只能对原类增加方法;
b:分类方法实现中,可以访问原来类的成员变量;
c:分类可以写和类同名的方法,但是这样会覆盖掉原来类的方法,导致永远访问不到原来的类的方法,所以不建议这么做;
调用顺序:分类——找不到方法时去——>原来类——找不到方法时去——>父类;可见分类的调用优先级最高;
d:当一个类有单个分类时,且每个分类都由同名方法,调用顺序和编译的顺序有关,最后编译的方法会覆盖先编译的方法,所以最后编译的会被调用;
分类的应用:给NSString增加方法,计算一个字符串中数字的个数;
// 在NSString+intSum.h文件中 // 对NSString类添加一个类方法和对象方法,计算字符串中整数的个数; #import <Foundation/Foundation.h> @interface NSString (intSum) //对NSString类添加一个类方法,计算字符串中整数的个数,声明 + (int)intSum:(NSString *)str; // 对象方法的声明 - (int)intCount; @end // 在NSString+intSum.m文件中 @implementation NSString (intSum) // 类方法的实现 + (int)intSum:(NSString *)str { int count = 0; for (int i = 0; i<str.length; i++) { int temp = [str characterAtIndex:i]; if (temp > '0' && temp < '9') { count++; } } return count; } // 对象方法的实现,只需调用类方法就可以了; - (int)intCount { return [NSString intSum:self]; } @end // 在main中测试 int main() { int sum = [NSString intSum:@"234df56"]; // 调用类方法 int count = [@"234sd454545" intCount]; // 调用对象方法 NSLog(@"sum=%d, count=%d", sum, count); return 0; }