一、什么是分类
分类 category 是OC中的语法,它可以在不修改OC类的原代码的情况下为这个类扩充方法。什么意思呢?也就是不用修改原类文件哪怕一个字符,就可以在这个类的分类中为原类添加想要的方法。通常情况下,分类是用在对系统自带类的方法扩充中,因为我们不知道苹果官方类的原代码,这时系统自带的类有时并不能完全满足用户需求,就可以用分类来为系统类添加方法,以满足需求。 另一个优点就是当开发一个类,而这个类十分庞大时,可以使用分类,让多个开发者共同开发这个类。
二、语法格式
分类的语法格式和类很相似,分为声明部分和实现部分,只是每个分类都有自己的别名,分类别名自定义,一般以功能或作者全名
分类的声明
@interface 原类名 (分类别名)
// 扩充的方法声明
@end
分类的实现
@implementation 原类名 (分类别名)
// 扩充的方法实现
@end
下面是小桥为系统自带类NSString写的一个分类:
// 文件:NSString+Qiao.h
// 项目:博客笔记
//
// 作者:葬花 桥
// 日期:14-5-7
// 版权:Copyright (c) 2014年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (Qiao)
// 扩充的方法声明
@end
// 文件:NSString+Qiao.m
// 项目:博客笔记
// 作者:葬花 桥
// 日期:14-5-7
// 版权:Copyright (c) 2014年 itcast. All rights reserved.
//
#import "NSString+Qiao.h"
@implementation NSString (Qiao)
// 扩充的方法实现
@end
三、使用举例
小桥在这里给个使用举例,给NSString类添加一个方法,用来计算字符串中的单词个数,代码如下 :
// 文件:NSString+Qiao.h
// 项目:博客笔记
// 作者:葬花 桥
// 日期:14-5-7
// 版权:Copyright (c) 2014年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (Qiao)
// 扩充的方法声明
// 计算字符串中的单词个数
- (int)countWordsOfString;
@end
// 文件:NSString+Qiao.m
// 项目:博客笔记
// 作者:葬花 桥
// 日期:14-5-7
// 版权:Copyright (c) 2014年 itcast. All rights reserved.
#import "NSString+Qiao.h"
@implementation NSString (Qiao)
// 扩充的方法实现
// 计算字符串中的单词个数
- (int)countWordsOfString;
{
BOOL isWord = NO;// 上一个字符是不是字母
int count = 0;// 单词个数
for (int i =0; i < self.length; i++)
{
unichar c = [selfcharacterAtIndex:i]; // 找出字符串中第 i个字符
if ( (c >= 'A' && c <='Z') || (c >= 'a' && c <='z') ) // 当前字符为字母
{
if (isWord == NO)// 如果上一个字符不是字母
{
count++;// 单词个数加1
}
isWord =YES; // 下次查找时,这次的字符是字母
continue; // 查找下一个字符
}
isWord =NO; // 当前字符不是字母
}
return count;
}
@end
这与使用原类一样,在使用时也要import这个类,下面是小桥测试截图:

四、分类的注意事项
1> 分类只能添加方法,而不能添加成员变量,分类也可以访问原类的成员变量,要添加成员变量只能通过第二种方法---继承。
2> 分类可以重新实现原类中的方法,但是会覆盖原类中方法,使得外部不能调用原类的方法,只能调用分类中重写的方法,MJ老师不推荐这么做。
3> 一个原类可以有多个分类,多个分类中如果有相同的方法,那么最后参与编译的分类中的方法才能调用,其它的都被覆盖。
4> 方法调用优先级:分类(最后编译的)---->原类----->父类